@sumaris-net/ngx-components 1.17.1 → 1.18.0-rc1

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.
@@ -1,9 +1,12 @@
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';
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';
2
4
  import { CommonModule, DOCUMENT, Location } from '@angular/common';
3
5
  import { CdkTableModule } from '@angular/cdk/table';
4
6
  import { A11yModule } from '@angular/cdk/a11y';
5
7
  import { OverlayModule, OverlayContainer, FullscreenOverlayContainer, Overlay } from '@angular/cdk/overlay';
6
8
  import { ScrollingModule } from '@angular/cdk/scrolling';
9
+ import * as i1$2 from '@angular/material/core';
7
10
  import { DateAdapter, MatCommonModule, MatRippleModule } from '@angular/material/core';
8
11
  import { MatTableModule, MatTable, MatColumnDef } from '@angular/material/table';
9
12
  import { MatSortModule, MatSort } from '@angular/material/sort';
@@ -27,52 +30,63 @@ import { MatProgressBarModule } from '@angular/material/progress-bar';
27
30
  import { MatRadioModule } from '@angular/material/radio';
28
31
  import { MatBadgeModule } from '@angular/material/badge';
29
32
  import { MatSlideToggleModule } from '@angular/material/slide-toggle';
33
+ import * as i2$1 from '@angular/material/dialog';
30
34
  import { MatDialogModule, MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';
31
35
  import { MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteModule, MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MAT_AUTOCOMPLETE_DEFAULT_OPTIONS } from '@angular/material/autocomplete';
32
36
  import { __awaiter, __decorate } from 'tslib';
37
+ import * as i1$6 from '@angular/forms';
33
38
  import { NG_VALUE_ACCESSOR, FormGroupDirective, AbstractControl, FormGroup, FormArray, FormControl, ReactiveFormsModule, Validators, FormBuilder } from '@angular/forms';
34
39
  import { timer, merge, fromEvent, BehaviorSubject, Subscription, Subject, isObservable, from, of, noop as noop$9, Observable, defer, forkJoin, combineLatest, EMPTY } from 'rxjs';
35
40
  import { filter, first, map, takeUntil, switchMap, startWith, debounceTime, takeWhile, tap, distinctUntilChanged, mergeMap, catchError, throttleTime, skip } from 'rxjs/operators';
41
+ import { trigger, transition, style, animate, state } from '@angular/animations';
42
+ import * as i1$1 from '@ngx-translate/core';
36
43
  import { TranslateService, TranslateModule } from '@ngx-translate/core';
37
- import { IonicModule, Platform, IonRouterOutlet, ModalController, PopoverController, IonicSafeString, createAnimation, ToastController, AlertController, IonicRouteStrategy, NavParams, MenuController, IonContent, IonInfiniteScroll } from '@ionic/angular';
44
+ import * as i1$4 from '@ionic/angular';
45
+ import { IonicModule, Platform, IonRouterOutlet, ModalController, IonicSafeString, createAnimation, ToastController, PopoverController, AlertController, IonicRouteStrategy, NavParams, MenuController, IonContent, IonInfiniteScroll } from '@ionic/angular';
38
46
  import * as momentImported from 'moment';
39
47
  import { isMoment } from 'moment';
48
+ import * as i1 from '@angular/material-moment-adapter';
40
49
  import { MomentDateAdapter, MatMomentDateModule } from '@angular/material-moment-adapter';
41
50
  import * as momentTZImported from 'moment-timezone';
42
51
  import { Keyboard } from '@ionic-native/keyboard/ngx';
43
52
  import { TextMaskModule } from 'angular2-text-mask';
44
53
  import { NgxMaterialTimepickerModule } from 'ngx-material-timepicker';
45
54
  import { MatDatepickerModule } from '@angular/material/datepicker';
46
- import { trigger, state, style, transition, animate } from '@angular/animations';
47
55
  import { MatDividerModule } from '@angular/material/divider';
48
56
  import { MatTooltipModule } from '@angular/material/tooltip';
49
57
  import { MatChipsModule } from '@angular/material/chips';
58
+ import * as i3$3 from '@angular/router';
50
59
  import { Router, ActivatedRoute, RouterModule, RouteReuseStrategy } from '@angular/router';
60
+ import * as i1$5 from '@angular/platform-browser';
51
61
  import { HammerGestureConfig, EventManager } from '@angular/platform-browser';
62
+ import * as i2$2 from '@angular/common/http';
52
63
  import { HttpResponse, HttpClient, HttpHeaders, HttpEventType, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
53
64
  import { ColorPickerModule } from 'ngx-color-picker';
54
- import { NativeAudio as NativeAudio$1 } from '@ionic-native/native-audio/ngx';
55
- import { Vibration as Vibration$1 } from '@ionic-native/vibration/ngx';
65
+ import { NativeAudio } from '@ionic-native/native-audio/ngx';
66
+ import { Vibration } from '@ionic-native/vibration/ngx';
56
67
  import { AudioManagement } from '@ionic-native/audio-management/ngx';
57
- import { NativeAudio } from '@ionic-native/native-audio/ngx/index';
58
- import { Vibration } from '@ionic-native/vibration/ngx/index';
59
- import { AudioManagement as AudioManagement$1 } from '@ionic-native/audio-management/ngx/index';
68
+ import * as i2 from '@ionic-native/native-audio/ngx/index';
69
+ import * as i3 from '@ionic-native/vibration/ngx/index';
70
+ import * as i4 from '@ionic-native/audio-management/ngx/index';
60
71
  import * as uuidv4Imported from 'uuid/v4';
61
72
  import { DragDropModule } from '@angular/cdk/drag-drop';
62
73
  import { MarkdownModule } from 'ngx-markdown';
63
74
  import { sign, box, hash, verify } from 'tweetnacl';
75
+ import * as i3$1 from '@ionic/storage';
64
76
  import { Storage, IonicStorageModule } from '@ionic/storage';
65
77
  import 'zone.js/dist/zone-error';
66
- import { SplashScreen as SplashScreen$1 } from '@ionic-native/splash-screen/ngx';
67
- import { Connection, Network as Network$1 } from '@ionic-native/network/ngx';
68
- import { CacheService as CacheService$1, CacheModule } from 'ionic-cache';
69
- import { CacheService } from 'ionic-cache/dist/cache.service';
70
- import { Network } from '@ionic-native/network/ngx/index';
71
- import { SplashScreen } from '@ionic-native/splash-screen/ngx/index';
72
- import { StatusBar as StatusBar$1 } from '@ionic-native/status-bar/ngx';
78
+ import { SplashScreen } from '@ionic-native/splash-screen/ngx';
79
+ import { Connection, Network } from '@ionic-native/network/ngx';
80
+ import { CacheService, CacheModule } from 'ionic-cache';
81
+ import * as i6 from 'ionic-cache/dist/cache.service';
82
+ import * as i9 from '@ionic-native/network/ngx/index';
83
+ import * as i10 from '@ionic-native/splash-screen/ngx/index';
84
+ import { StatusBar } from '@ionic-native/status-bar/ngx';
85
+ import * as i2$4 from '@angular/cdk/platform';
73
86
  import { Platform as Platform$1 } from '@angular/cdk/platform';
74
- import { InAppBrowser as InAppBrowser$1 } from '@ionic-native/in-app-browser/ngx';
87
+ import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
75
88
  import { ApolloLink, NetworkStatus, InMemoryCache, ApolloClient, gql } from '@apollo/client/core';
89
+ import * as i2$3 from 'apollo-angular';
76
90
  import { Apollo } from 'apollo-angular';
77
91
  import { WebSocketLink } from '@apollo/client/link/ws';
78
92
  import { getMainDefinition } from '@apollo/client/utilities';
@@ -80,13 +94,14 @@ import { RetryLink } from '@apollo/client/link/retry';
80
94
  import QueueLink from 'apollo-link-queue';
81
95
  import SerializingLink from 'apollo-link-serialize';
82
96
  import loggerLink from 'apollo-link-logger';
97
+ import * as i3$2 from 'apollo-angular/http';
83
98
  import { HttpLink } from 'apollo-angular/http';
84
99
  import { IonicStorageWrapper, persistCache } from 'apollo3-cache-persist';
85
- import { NotificationVisibility, Downloader as Downloader$1 } from '@ionic-native/downloader/ngx';
86
- import { StatusBar } from '@ionic-native/status-bar/ngx/index';
87
- import { Keyboard as Keyboard$1 } from '@ionic-native/keyboard/ngx/index';
88
- import { InAppBrowser } from '@ionic-native/in-app-browser/ngx/index';
89
- import { Downloader } from '@ionic-native/downloader/ngx/index';
100
+ import { NotificationVisibility, Downloader } from '@ionic-native/downloader/ngx';
101
+ import * as i14 from '@ionic-native/status-bar/ngx/index';
102
+ import * as i15 from '@ionic-native/keyboard/ngx/index';
103
+ import * as i17 from '@ionic-native/in-app-browser/ngx/index';
104
+ import * as i18 from '@ionic-native/downloader/ngx/index';
90
105
  import { CdkTextareaAutosize } from '@angular/cdk/text-field';
91
106
  import { ValidatorService, TableDataSource } from '@e-is/ngx-material-table';
92
107
  import { SelectionModel } from '@angular/cdk/collections';
@@ -942,6 +957,109 @@ function fromScrollEndEvent(element, threshold) {
942
957
  .pipe(filter(() => isEnd()));
943
958
  }
944
959
 
960
+ // import the required animation functions from the angular animations module
961
+ const fadeInAnimation =
962
+ // trigger name for attaching this animation to an element using the [@triggerName] syntax
963
+ trigger('fadeInAnimation', [
964
+ // route 'enter' transition
965
+ transition(':enter', [
966
+ // css styles at start of transition
967
+ style({ opacity: 0 }),
968
+ // animation and styles at end of transition
969
+ animate('.3s', style({ opacity: 1 }))
970
+ ]),
971
+ ]);
972
+ const fadeInOutAnimation =
973
+ // trigger name for attaching this animation to an element using the [@triggerName] syntax
974
+ trigger('fadeInOutAnimation', [
975
+ // route 'enter' transition
976
+ transition(':enter', [
977
+ // css styles at start of transition
978
+ style({ opacity: 0 }),
979
+ // animation and styles at end of transition
980
+ animate('.3s', style({ opacity: 1 }))
981
+ ]),
982
+ // route 'leave' transition
983
+ transition(':leave', [
984
+ // animation and styles at end of transition
985
+ animate('.5s ease-in-out', style({
986
+ opacity: 0
987
+ }))
988
+ ]),
989
+ ]);
990
+ const slideInOutAnimation =
991
+ // trigger name for attaching this animation to an element using the [@triggerName] syntax
992
+ trigger('slideInOutAnimation', [
993
+ // end state styles for route container (host)
994
+ state('*', style({
995
+ // the view covers the whole screen with a semi tranparent background
996
+ position: 'relative',
997
+ top: 0,
998
+ left: 0,
999
+ right: 0,
1000
+ bottom: 0,
1001
+ opacity: 1
1002
+ })),
1003
+ // route 'enter' transition
1004
+ transition(':enter', [
1005
+ // styles at start of transition
1006
+ style({
1007
+ // start with the content positioned off the right of the screen,
1008
+ // -400% is required instead of -100% because the negative position adds to the width of the element
1009
+ left: '400%',
1010
+ // start with background opacity set to 0 (invisible)
1011
+ opacity: 0
1012
+ }),
1013
+ // animation and styles at end of transition
1014
+ animate('.3s ease-in-out', style({
1015
+ // transition the right position to 0 which slides the content into view
1016
+ left: 0,
1017
+ // transition the background opacity to 0.8 to fade it in
1018
+ opacity: 0.8
1019
+ }))
1020
+ ]),
1021
+ // route 'leave' transition
1022
+ transition(':leave', [
1023
+ // animation and styles at end of transition
1024
+ animate('.5s ease-in-out', style({
1025
+ // transition the right position to -400% which slides the content out of view
1026
+ left: '400%',
1027
+ // transition the background opacity to 0 to fade it out
1028
+ opacity: 0
1029
+ }))
1030
+ ])
1031
+ ]);
1032
+ const slideUpDownAnimation =
1033
+ // trigger name for attaching this animation to an element using the [@triggerName] syntax
1034
+ trigger('slideUpDownAnimation', [
1035
+ // end state styles for route container (host)
1036
+ state('*', style({
1037
+ transform: 'translateY(0)',
1038
+ opacity: 1
1039
+ })),
1040
+ // route 'enter' transition
1041
+ transition(':enter', [
1042
+ // styles at start of transition
1043
+ style({
1044
+ transform: 'translateY(-400%)',
1045
+ opacity: 0
1046
+ }),
1047
+ // animation and styles at end of transition
1048
+ animate('.3s ease-in-out', style({
1049
+ transform: 'translateY(0)',
1050
+ opacity: 1
1051
+ }))
1052
+ ]),
1053
+ // route 'leave' transition
1054
+ transition(':leave', [
1055
+ // animation and styles at end of transition
1056
+ animate('.5s ease-in-out', style({
1057
+ transform: 'translateY(-100%)',
1058
+ opacity: 0
1059
+ }))
1060
+ ])
1061
+ ]);
1062
+
945
1063
  class MatAutocompleteConfigHolder {
946
1064
  constructor(options) {
947
1065
  this.options = options;
@@ -963,8 +1081,8 @@ class MatAutocompleteConfigHolder {
963
1081
  // Keep original the function from options, when exists
964
1082
  const attributesOrFn = attributes.map((a, index) => typeof a === 'function' && options.attributes[index] || a);
965
1083
  const filter = Object.assign({ searchAttribute: attributes.length === 1 ? attributes[0] : undefined, searchAttributes: attributes.length > 1 ? attributes : undefined }, options.filter);
966
- const displayWith = options.displayWith || ((obj) => obj && joinPropertiesPath(obj, attributes));
967
- const equals = options.equals || ((o1, o2) => o1 && o2 && o1.id === o2.id);
1084
+ const displayWith = options.displayWith || MatAutocompleteFieldUtils.createDisplayFn(attributes, options.multiple);
1085
+ const equals = options.equals || MatAutocompleteFieldUtils.defaultEquals;
968
1086
  const config = Object.assign(Object.assign({}, options), { attributes: attributesOrFn, suggestFn,
969
1087
  filter,
970
1088
  displayWith,
@@ -979,14 +1097,31 @@ class MatAutocompleteConfigHolder {
979
1097
  return this.fields[fieldName] || this.add(fieldName);
980
1098
  }
981
1099
  }
982
- const noop = (_) => { };
983
- const ɵ0 = noop;
1100
+ class MatAutocompleteFieldUtils {
1101
+ static createDisplayFn(displayAttributes, multiple) {
1102
+ // if multiple (manage array)
1103
+ if (multiple) {
1104
+ return (value) => {
1105
+ return Array.isArray(value)
1106
+ ? (value || []).map(obj => obj && joinPropertiesPath(obj, displayAttributes)).join(', ')
1107
+ : value && joinPropertiesPath(value, displayAttributes);
1108
+ };
1109
+ }
1110
+ // Join properties
1111
+ return (obj) => obj && joinPropertiesPath(obj, displayAttributes);
1112
+ }
1113
+ static defaultEquals(o1, o2) {
1114
+ return isNotNil(o1 === null || o1 === void 0 ? void 0 : o1.id) && o1.id === (o2 === null || o2 === void 0 ? void 0 : o2.id);
1115
+ }
1116
+ }
1117
+ const noop$8 = (_) => { };
1118
+ const ɵ0$c = noop$8;
984
1119
  class MatAutocompleteField {
985
1120
  constructor(cd, formGroupDir) {
986
1121
  this.cd = cd;
987
1122
  this.formGroupDir = formGroupDir;
988
- this._onChangeCallback = noop;
989
- this._onTouchedCallback = noop;
1123
+ this._onChangeCallback = noop$8;
1124
+ this._onTouchedCallback = noop$8;
990
1125
  this.logPrefix = '[mat-autocomplete] ';
991
1126
  this.formControlName = null;
992
1127
  this.required = false;
@@ -994,12 +1129,13 @@ class MatAutocompleteField {
994
1129
  this.debounceTime = null;
995
1130
  this.i18nPrefix = 'REFERENTIAL.';
996
1131
  this.noResultMessage = 'COMMON.NO_RESULT';
997
- this.multiple = false;
998
1132
  this.itemSize = '48px';
999
1133
  this.fetchMoreThreshold = '15%';
1000
1134
  this.suggestLengthThreshold = null;
1001
1135
  this.showLoadingSpinner = true;
1002
1136
  this.debug = false;
1137
+ this.showSearchBar = true;
1138
+ this.stickySearchBar = true;
1003
1139
  this.clicked = new EventEmitter();
1004
1140
  this.blurred = new EventEmitter();
1005
1141
  this.focused = new EventEmitter();
@@ -1079,6 +1215,9 @@ class MatAutocompleteField {
1079
1215
  get loading() {
1080
1216
  return isNil(this.$filteredItems.value);
1081
1217
  }
1218
+ get desktop() {
1219
+ return !this.mobile;
1220
+ }
1082
1221
  ngOnInit() {
1083
1222
  var _a, _b;
1084
1223
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
@@ -1096,6 +1235,7 @@ class MatAutocompleteField {
1096
1235
  this.displayColumnNames = this.displayColumnNames || this.config.columnNames;
1097
1236
  this.displayWith = this.displayWith || this.config.displayWith;
1098
1237
  this.equals = this.equals || this.config.equals;
1238
+ this.multiple = toBoolean(this.multiple, this.config.multiple);
1099
1239
  this.mobile = toBoolean(this.mobile, this.config.mobile);
1100
1240
  this.suggestLengthThreshold = toNumber(this.suggestLengthThreshold, this.config.suggestLengthThreshold || 0);
1101
1241
  this.showAllOnFocus = toBoolean(this.showAllOnFocus, toBoolean(this.config.showAllOnFocus, this.suggestLengthThreshold <= 0));
@@ -1105,8 +1245,11 @@ class MatAutocompleteField {
1105
1245
  this.highlightAccent = toBoolean(this.highlightAccent, toBoolean(this.config.highlightAccent));
1106
1246
  }
1107
1247
  // Default values
1248
+ this.multiple = toBoolean(this.multiple, false);
1249
+ this.mobile = toBoolean(this.mobile, this.multiple);
1108
1250
  this.displayAttributes = this.displayAttributes || ((_a = this.filter) === null || _a === void 0 ? void 0 : _a.attributes) || ['label', 'name'];
1109
- this.displayWith = this.displayWith || ((obj) => obj && joinPropertiesPath(obj, this.displayAttributes));
1251
+ this.displayWith = this.displayWith || MatAutocompleteFieldUtils.createDisplayFn(this.displayAttributes, this.multiple);
1252
+ this.equals = this.equals || MatAutocompleteFieldUtils.defaultEquals;
1110
1253
  this.displayColumnSizes = this.displayColumnSizes
1111
1254
  // if only column: auto size
1112
1255
  || (this.displayAttributes.length === 1 && [undefined])
@@ -1114,24 +1257,21 @@ class MatAutocompleteField {
1114
1257
  // - if label then col size = 2
1115
1258
  // - if rankOrder then col size = 1
1116
1259
  // - ese => auto size
1117
- || this.displayAttributes.map(attr => (attr && attr.endsWith('label')) ? 2
1118
- : ((attr && attr.endsWith('rankOrder')) ? 1
1119
- : undefined));
1260
+ || this.displayAttributes.map(attr => attr && (attr.endsWith('label') ? 3
1261
+ : (attr.endsWith('rankOrder') ? 2
1262
+ : undefined)));
1120
1263
  this.displayColumnNames = this.displayAttributes.map((attr, index) => this.displayColumnNames && this.displayColumnNames[index] ||
1121
1264
  (this.i18nPrefix + changeCaseToUnderscore(attr).toUpperCase()));
1122
- this.mobile = toBoolean(this.mobile, false);
1123
- this.searchable = !this.mobile && !this.multiple;
1124
- this.equals = this.equals || ((o1, o2) => o1 && o2 && o1.id === o2.id);
1125
1265
  const classList = (_b = this.classList) === null || _b === void 0 ? void 0 : _b.split(' ');
1126
1266
  this.panelWidth = this.panelWidth || (classList && ((classList.includes('min-width-medium') && '300px')
1127
1267
  || (classList.includes('min-width-large') && '400px')
1128
1268
  || (classList.includes('min-width-xlarge') && '450px')
1129
1269
  || (classList.includes('mat-autocomplete-panel-full-size') && '100vw')));
1130
1270
  this.showPanelOnFocus = toBoolean(this.showPanelOnFocus, true);
1131
- this.debounceTime = toNumber(this.debounceTime, 250);
1271
+ this.debounceTime = toNumber(this.debounceTime, this.mobile ? 650 : 250);
1132
1272
  this.highlightAccent = toBoolean(this.highlightAccent, false);
1133
1273
  this.suggestLengthThreshold = this.suggestLengthThreshold || 0;
1134
- this.matAutocompletePosition = this.matAutocompletePosition || (this.mobile && this.searchable ? 'above' : 'auto'); // On mobile, set position to above (because of bottom keyboard)
1274
+ this.matAutocompletePosition = this.matAutocompletePosition || 'auto';
1135
1275
  // No suggestFn: filter on the given items
1136
1276
  if (!this.suggestFn) {
1137
1277
  const suggestFromArrayFn = (value, filter) => __awaiter(this, void 0, void 0, function* () {
@@ -1152,10 +1292,10 @@ class MatAutocompleteField {
1152
1292
  return this.suggestFn(value, filter); // Loop
1153
1293
  });
1154
1294
  }
1155
- else if (!this.searchable) {
1295
+ else if (this.mobile) {
1156
1296
  // Manually fill input items, from the given suggest function
1157
- this._subscription.add(this._$filter.pipe(startWith(this.filter), debounceTime(250), takeWhile((_) => !this.searchable), // Close subscription, when enabling search (no more mat-select)
1158
- switchMap((filter) => this.suggest('*', filter)))
1297
+ this._subscription.add(this._$filter.pipe(startWith(this.filter), debounceTime(250), takeWhile((_) => this.mobile), // Close subscription, when not mobile (no more mat-select)
1298
+ filter(_ => this.suggestLengthThreshold <= 0), switchMap((filter) => this.suggest('*', filter)))
1159
1299
  .subscribe(items => this.$inputItems.next(items)));
1160
1300
  }
1161
1301
  // Send value to suggest when :
@@ -1171,11 +1311,17 @@ class MatAutocompleteField {
1171
1311
  this._reload$,
1172
1312
  // Search text (no distinctUntilChanged() because of the debounceTime() pipe)
1173
1313
  this.formControl.valueChanges
1174
- .pipe(filter(value => this.enabled && this.searchable && isNotNilString(value)),
1314
+ .pipe(filter(value => this.enabled && isNotNilString(value)),
1175
1315
  // Mark as loading (to show loading spinner) - earlier as possible, so before the debounce time
1176
1316
  tap(_ => this.showLoadingSpinner && this.markAsLoading()),
1177
1317
  // Filter if not enough character
1178
- filter(value => value.length >= this.suggestLengthThreshold),
1318
+ filter(value => {
1319
+ if (value.length >= this.suggestLengthThreshold)
1320
+ return true;
1321
+ // Update display value, to enable the message "not enough characters"
1322
+ this.displayValue = value;
1323
+ return false;
1324
+ }),
1179
1325
  // Wait a debounce time
1180
1326
  debounceTime(this.debounceTime)
1181
1327
  // DEBUG
@@ -1183,37 +1329,34 @@ class MatAutocompleteField {
1183
1329
  ),
1184
1330
  // Object set: use it (no distinctUntilChanged() pipe need)
1185
1331
  this.formControl.valueChanges
1186
- .pipe(startWith(this.formControl.value), filter(value => (this.searchable && isNotNil(value) && typeof value === 'object')), tap(value => {
1332
+ .pipe(startWith(this.formControl.value), filter(value => (!this.mobile && isNotNil(value) && typeof value === 'object')), tap(value => {
1187
1333
  // DEBUG
1188
- if (this.debug)
1189
- console.debug(this.logPrefix + ' object changes:', value);
1334
+ //if (this.debug) console.debug(this.logPrefix + ' object changes:', value)
1335
+ var _a;
1190
1336
  // Update the display value (if need)
1191
1337
  const displayValue = this.displayWith(value) || '';
1192
1338
  if (this.displayValue !== displayValue) {
1193
1339
  this.displayValue = displayValue;
1194
1340
  // Apply to the input[type=text] field
1195
- if (this.matInputText && this.matInputText.nativeElement) {
1341
+ if ((_a = this.matInputText) === null || _a === void 0 ? void 0 : _a.nativeElement) {
1196
1342
  this.matInputText.nativeElement.value = this.displayValue;
1197
1343
  }
1198
1344
  }
1199
- })
1200
- // DEBUG
1201
- //,tap(value => this.debug && console.debug(this.logPrefix + ' Received an object value: ', value))
1202
- ),
1345
+ })),
1203
1346
  // On dropdown button click (no distinctUntilChanged(), nor debounceTime)
1204
1347
  this.dropButtonClick
1205
- .pipe(filter(event => this.searchable && this.enabled && (!event || !event.defaultPrevented)), map(_ => this.showAllOnFocus ? '*' : this.formControl.value),
1348
+ .pipe(filter(event => !this.mobile && this.enabled && (!event || !event.defaultPrevented)), map(_ => this.showAllOnFocus ? '*' : this.formControl.value),
1206
1349
  // Make sure there is enough characters
1207
1350
  filter(thresholdFilterFn)),
1208
1351
  // Merge some observables, with a common distinctUntilChanged() pipe, and NO debounceTime
1209
1352
  merge(
1210
1353
  // Focus or click => Load all
1211
1354
  merge(this.focused, this.clicked)
1212
- .pipe(filter(_ => this.enabled && this.searchable), map(_ => this.showAllOnFocus ? '*' : this.formControl.value)
1355
+ .pipe(filter(_ => this.enabled && !this.mobile), map(_ => this.showAllOnFocus ? '*' : this.formControl.value)
1213
1356
  // DEBUG
1214
1357
  //,tap(value => this.debug && console.debug(this.logPrefix + ' Received focused or clicked event: ', value))
1215
1358
  ), merge(this.$inputItems, this._$filter)
1216
- .pipe(filter(_ => this.searchable && this.enabled), map(_ => this.formControl.value)))
1359
+ .pipe(filter(_ => this.enabled), map(_ => this.formControl.value)))
1217
1360
  .pipe(
1218
1361
  // Make sure there is enough characters
1219
1362
  filter(thresholdFilterFn),
@@ -1246,7 +1389,7 @@ class MatAutocompleteField {
1246
1389
  fetchMoreItemsChanges)
1247
1390
  .subscribe(items => {
1248
1391
  // Make sure control value is inside (mat-select)
1249
- if (items && !this.searchable) {
1392
+ if (items && this.mobile) {
1250
1393
  const value = this.formControl.value;
1251
1394
  if (isNotNil(value) && typeof value === 'object' && items.findIndex(item => this.equals(item, value)) === -1) {
1252
1395
  // If form value is missing: add it to the list
@@ -1260,7 +1403,7 @@ class MatAutocompleteField {
1260
1403
  this._subscription.add(this.blurred
1261
1404
  .pipe(
1262
1405
  // Skip if not searchable
1263
- filter(_ => this.searchable), map(_ => this.formControl.value)
1406
+ filter(_ => !this.mobile), map(_ => this.formControl.value)
1264
1407
  // DEBUG
1265
1408
  //,tap(value => this.debug && console.debug(this.logPrefix + ' Received blurred event: ', value)),
1266
1409
  )
@@ -1284,6 +1427,7 @@ class MatAutocompleteField {
1284
1427
  this.$filteredItems.next(undefined);
1285
1428
  }
1286
1429
  this._implicitValue = null; // reset the implicit value
1430
+ this.closePanel(); // Clone panel
1287
1431
  }));
1288
1432
  // Listen form control status change
1289
1433
  this._subscription.add(this.formControl.statusChanges
@@ -1294,6 +1438,7 @@ class MatAutocompleteField {
1294
1438
  .subscribe(() => this.checkIfTouched()));
1295
1439
  this._subscription.add(this.keydownEscape.subscribe(event => {
1296
1440
  if (this.isOpen) {
1441
+ // Avoid form or page to manage escape event
1297
1442
  event === null || event === void 0 ? void 0 : event.stopPropagation();
1298
1443
  event === null || event === void 0 ? void 0 : event.preventDefault();
1299
1444
  // DEBUG
@@ -1329,7 +1474,6 @@ class MatAutocompleteField {
1329
1474
  this.equals = null;
1330
1475
  this.suggestFn = null;
1331
1476
  this.$filteredItems = null;
1332
- this.matSelectItems$ = null;
1333
1477
  this.config = null;
1334
1478
  this.classList = null;
1335
1479
  this._onChangeCallback = null;
@@ -1344,8 +1488,13 @@ class MatAutocompleteField {
1344
1488
  * Allow to reload content. Useful when filter has been changed but not detected
1345
1489
  */
1346
1490
  reloadItems(value) {
1491
+ var _a;
1347
1492
  // Force a refresh
1348
1493
  this._reload$.next(value || '*');
1494
+ // Clear the search bar, because options will not correspond
1495
+ if (!this.isOpen && isNotNilOrBlank((_a = this.ionSearchbar) === null || _a === void 0 ? void 0 : _a.value)) {
1496
+ this.ionSearchbar.value = null;
1497
+ }
1349
1498
  }
1350
1499
  writeValue(value) {
1351
1500
  // DEBUG
@@ -1369,15 +1518,15 @@ class MatAutocompleteField {
1369
1518
  this.cd.markForCheck();
1370
1519
  }
1371
1520
  focus() {
1372
- var _a;
1373
- if (this.searchable) {
1374
- focusInput(this.matInputText);
1521
+ if (this.mobile) {
1522
+ this.matSelect.focus();
1375
1523
  }
1376
1524
  else {
1377
- (_a = this.matSelect) === null || _a === void 0 ? void 0 : _a.focus();
1525
+ focusInput(this.matInputText);
1378
1526
  }
1379
1527
  }
1380
1528
  filterInputTextFocusEvent(event) {
1529
+ var _a;
1381
1530
  if (!event || event.defaultPrevented)
1382
1531
  return;
1383
1532
  // Ignore event from mat-option
@@ -1392,7 +1541,7 @@ class MatAutocompleteField {
1392
1541
  }
1393
1542
  // DEBUG
1394
1543
  //if (this.debug) console.debug(this.logPrefix + ' Select input content');
1395
- const hasContent = true; // selectInputContent(event);
1544
+ const hasContent = isNotNilOrBlank((_a = event.target) === null || _a === void 0 ? void 0 : _a.value);
1396
1545
  // If combo is empty, or if has content but should force to show panel on focus
1397
1546
  if (!hasContent || this.showPanelOnFocus || this.showAllOnFocus) {
1398
1547
  // DEBUG
@@ -1412,18 +1561,38 @@ class MatAutocompleteField {
1412
1561
  event.stopPropagation();
1413
1562
  event.returnValue = false;
1414
1563
  // DEBUG
1415
- if (this.debug)
1416
- console.debug(this.logPrefix + " Cancelling blur event");
1564
+ //if (this.debug) console.debug(this.logPrefix + " Cancelling blur event");
1417
1565
  return false;
1418
1566
  }
1419
- //DEBUG
1420
- if (this.debug)
1421
- console.debug(this.logPrefix + ' Blur: move caret to the beginning');
1567
+ // DEBUG
1568
+ //if (this.debug) console.debug(this.logPrefix + ' Blur: move caret to the beginning');
1422
1569
  // Move caret to the beginning (fix issue IMAGINE-469)
1423
1570
  selectInputRange(event.target, 0, 0);
1424
1571
  this.blurred.emit(event);
1425
1572
  return true;
1426
1573
  }
1574
+ ionSearchBarChanged(event) {
1575
+ if (!event || event.defaultPrevented || !this.matSelect.panelOpen)
1576
+ return;
1577
+ // DEBUG
1578
+ //console.debug(this.logPrefix + " Received <ion-searchbar> changes", event.detail.data);
1579
+ event.preventDefault();
1580
+ event.detail.preventDefault();
1581
+ event.stopPropagation();
1582
+ event.detail.stopPropagation();
1583
+ this.markAsLoading();
1584
+ this.reloadItems(event.detail.data);
1585
+ // TODO avoid mat-select to focus the option
1586
+ /*if (this.multiple) {
1587
+ this.matSelect._elementRef;
1588
+ }*/
1589
+ }
1590
+ ionSearchBarClear(event) {
1591
+ if (!event || event.defaultPrevented || !this.matSelect.panelOpen)
1592
+ return;
1593
+ this.markAsLoading();
1594
+ this.reloadItems();
1595
+ }
1427
1596
  filterMatSelectFocusEvent(event) {
1428
1597
  if (!event || event.defaultPrevented)
1429
1598
  return;
@@ -1449,20 +1618,6 @@ class MatAutocompleteField {
1449
1618
  this.blurred.emit(event);
1450
1619
  return true;
1451
1620
  }
1452
- toggleSearch(event) {
1453
- const searchable = !this.searchable;
1454
- if (searchable && this.searchable && this.matInputText) {
1455
- this.focus();
1456
- }
1457
- else {
1458
- this.searchable = searchable;
1459
- if (searchable) {
1460
- this.autofocus = true;
1461
- this.showPanelOnFocus = false;
1462
- }
1463
- this.markForCheck();
1464
- }
1465
- }
1466
1621
  clearValue(event) {
1467
1622
  this.writeValue(null);
1468
1623
  event.stopPropagation();
@@ -1512,7 +1667,7 @@ class MatAutocompleteField {
1512
1667
  }
1513
1668
  get isOpen() {
1514
1669
  var _a, _b;
1515
- return (this.searchable && ((_a = this.autocomplete) === null || _a === void 0 ? void 0 : _a.isOpen))
1670
+ return (!this.mobile && ((_a = this.autocomplete) === null || _a === void 0 ? void 0 : _a.isOpen))
1516
1671
  || ((_b = this.matSelect) === null || _b === void 0 ? void 0 : _b.panelOpen)
1517
1672
  || false;
1518
1673
  }
@@ -1551,8 +1706,7 @@ class MatAutocompleteField {
1551
1706
  res = data;
1552
1707
  }
1553
1708
  // DEBUG
1554
- if (this.debug)
1555
- console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, res);
1709
+ //if (this.debug) console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, res);
1556
1710
  return res;
1557
1711
  });
1558
1712
  }
@@ -1571,7 +1725,7 @@ class MatAutocompleteField {
1571
1725
  });
1572
1726
  }
1573
1727
  updateImplicitValue(items) {
1574
- if (this.searchable) {
1728
+ if (!this.mobile) {
1575
1729
  // Store implicit value (will use it onBlur if not other value selected)
1576
1730
  if (items && items.length === 1) {
1577
1731
  this._implicitValue = items[0];
@@ -1624,12 +1778,13 @@ MatAutocompleteField.decorators = [
1624
1778
  { type: Component, args: [{
1625
1779
  // eslint-disable-next-line @angular-eslint/component-selector
1626
1780
  selector: 'mat-autocomplete-field',
1627
- 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 [title]=\"displayValue\"\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 [placeholder]=\"placeholder\"\n [formControl]=\"formControl\" readonly>\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 [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Basic select -->\n <mat-select #matSelect\n *ngIf=\"!searchable; else searchableTemplate\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"classList\"\n [style.width]=\"panelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- header -->\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- None option -->\n <mat-option *ngIf=\"!required\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <ng-container *ngIf=\"$filteredItems | async; let items\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label>{{noResultMessage | translate}}</ion-label>\n </mat-option>\n\n <!-- options -->\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text>{{item | propertyGet: path }}</ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initMatSelectInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text *ngIf=\"itemCount; let count\" class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </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 #searchableTemplate>\n <input matInput #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"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\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\n <ng-container *ngIf=\"$filteredItems | async; else loadingTemplate; let items\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><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=\"(matInputText.value | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text *ngIf=\"itemCount; let count\" class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </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=\"searchable\"\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 type=\"button\" mat-icon-button tabindex=\"-1\"\n *ngIf=\"enabled && mobile && !searchable && !multiple\"\n [title]=\"'COMMON.BTN_SEARCH'|translate\"\n (click)=\"toggleSearch($event)\">\n <mat-icon>search</mat-icon>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
1781
+ 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 [title]=\"displayValue\"\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 [placeholder]=\"placeholder\"\n [formControl]=\"formControl\" readonly>\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 [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Mobile or Mutliple (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 <ion-searchbar *ngIf=\"showSearchBar\" #ionSearchbar\n class=\"mat-select-header\"\n [class.ion-searchbar-sticky]=\"stickySearchBar\"\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"true\"\n showClearButton\n [debounce]=\"debounceTime\"\n (ionClear)=\"ionSearchBarClear($event)\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH'|translate\"\n ></ion-searchbar>\n\n <!-- Headers -->\n <ion-row class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.ion-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\" 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 <!-- 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)=\"_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 <ion-row *ngIf=\"itemCount as count\"\n 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 <!-- 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=\"desktop\"\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<ng-template #options>\n\n\n</ng-template>\n\n",
1628
1782
  providers: [{
1629
1783
  provide: NG_VALUE_ACCESSOR,
1630
1784
  multi: true,
1631
1785
  useExisting: forwardRef(() => MatAutocompleteField)
1632
1786
  }],
1787
+ animations: [slideInOutAnimation],
1633
1788
  changeDetection: ChangeDetectionStrategy.OnPush,
1634
1789
  styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button[hidden]{display:none}mat-icon.select-arrow{color:rgba(0,0,0,.47);font-size:150%}"]
1635
1790
  },] }
@@ -1670,6 +1825,8 @@ MatAutocompleteField.propDecorators = {
1670
1825
  suggestLengthThreshold: [{ type: Input }],
1671
1826
  showLoadingSpinner: [{ type: Input }],
1672
1827
  debug: [{ type: Input }],
1828
+ showSearchBar: [{ type: Input }],
1829
+ stickySearchBar: [{ type: Input }],
1673
1830
  clicked: [{ type: Output, args: ['click',] }],
1674
1831
  blurred: [{ type: Output, args: ['blur',] }],
1675
1832
  focused: [{ type: Output, args: ['focus',] }],
@@ -1677,6 +1834,7 @@ MatAutocompleteField.propDecorators = {
1677
1834
  keydownEscape: [{ type: Output, args: ['keydown.escape',] }],
1678
1835
  keyupEnter: [{ type: Output, args: ['keyup.enter',] }],
1679
1836
  matSelect: [{ type: ViewChild, args: ['matSelect',] }],
1837
+ ionSearchbar: [{ type: ViewChild, args: ['ionSearchbar',] }],
1680
1838
  matInputText: [{ type: ViewChild, args: ['matInputText',] }],
1681
1839
  autocomplete: [{ type: ViewChild, args: [MatAutocomplete,] }],
1682
1840
  autocompleteTrigger: [{ type: ViewChild, args: [MatAutocompleteTrigger,] }],
@@ -1706,7 +1864,7 @@ class DateFormatPipe {
1706
1864
  return this.dateAdapter.format(date, displayFormat);
1707
1865
  }
1708
1866
  }
1709
- DateFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(ɵɵinject(MomentDateAdapter), ɵɵinject(TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1867
+ DateFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(i0.ɵɵinject(i1.MomentDateAdapter), i0.ɵɵinject(i1$1.TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1710
1868
  DateFormatPipe.decorators = [
1711
1869
  { type: Pipe, args: [{
1712
1870
  name: 'dateFormat'
@@ -1718,7 +1876,7 @@ DateFormatPipe.ctorParameters = () => [
1718
1876
  { type: TranslateService }
1719
1877
  ];
1720
1878
 
1721
- const moment = momentImported;
1879
+ const moment$7 = momentImported;
1722
1880
  class DateDiffDurationPipe {
1723
1881
  constructor(dateAdapter, translate) {
1724
1882
  this.dateAdapter = dateAdapter;
@@ -1734,17 +1892,17 @@ class DateDiffDurationPipe {
1734
1892
  return this.format(startDate, endDate);
1735
1893
  }
1736
1894
  format(startDate, endDate) {
1737
- const duration = moment.duration(endDate.diff(startDate));
1895
+ const duration = moment$7.duration(endDate.diff(startDate));
1738
1896
  if (duration.asMinutes() < 0)
1739
1897
  return '';
1740
- const timeDuration = moment(0)
1898
+ const timeDuration = moment$7(0)
1741
1899
  .hour(duration.hours())
1742
1900
  .minute(duration.minutes());
1743
1901
  const days = Math.floor(duration.asDays());
1744
1902
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + timeDuration.format('HH:mm');
1745
1903
  }
1746
1904
  }
1747
- DateDiffDurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateDiffDurationPipe_Factory() { return new DateDiffDurationPipe(ɵɵinject(DateAdapter), ɵɵinject(TranslateService)); }, token: DateDiffDurationPipe, providedIn: "root" });
1905
+ 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" });
1748
1906
  DateDiffDurationPipe.decorators = [
1749
1907
  { type: Pipe, args: [{
1750
1908
  name: 'dateDiffDuration'
@@ -1765,7 +1923,7 @@ class DateFromNowPipe {
1765
1923
  return date ? date.fromNow(args && args.withoutSuffix) : '';
1766
1924
  }
1767
1925
  }
1768
- DateFromNowPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(ɵɵinject(MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
1926
+ DateFromNowPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(i0.ɵɵinject(i1.MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
1769
1927
  DateFromNowPipe.decorators = [
1770
1928
  { type: Pipe, args: [{
1771
1929
  name: 'dateFromNow'
@@ -1834,7 +1992,7 @@ function formatToDD(value, opts) {
1834
1992
  value *= -1;
1835
1993
  }
1836
1994
  }
1837
- let degrees = roundFloat(value, opts.maxDecimals).toString();
1995
+ let degrees = roundFloat$1(value, opts.maxDecimals).toString();
1838
1996
  // Add sign
1839
1997
  let sign = negative ? '-' : '+';
1840
1998
  if (opts.placeholderChar) {
@@ -1885,7 +2043,7 @@ function formatToDDMMSS(value, opts) {
1885
2043
  }
1886
2044
  let degrees = Math.trunc(value);
1887
2045
  let minutes = Math.trunc((value - degrees) * 60);
1888
- let seconds = roundFloat(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
2046
+ let seconds = roundFloat$1(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
1889
2047
  while (seconds >= 60) {
1890
2048
  seconds -= 60;
1891
2049
  minutes += 1;
@@ -1953,7 +2111,7 @@ function formatToDDMM(value, opts) {
1953
2111
  }
1954
2112
  }
1955
2113
  let degrees = Math.trunc(value);
1956
- let minutes = roundFloat((value - degrees) * 60, opts.maxDecimals);
2114
+ let minutes = roundFloat$1((value - degrees) * 60, opts.maxDecimals);
1957
2115
  while (minutes >= 60) {
1958
2116
  minutes -= 60;
1959
2117
  degrees += 1;
@@ -2004,15 +2162,15 @@ function parseLatitudeOrLongitude(input, pattern, maxDecimals, placeholderChar)
2004
2162
  return NaN;
2005
2163
  }
2006
2164
  if (pattern === 'DD')
2007
- return roundFloat(degrees, maxDecimals);
2165
+ return roundFloat$1(degrees, maxDecimals);
2008
2166
  const minutes = (pattern === 'DDMMSS' || pattern === 'DDMM') && parts[1] && parseFloat(parts[1].replace(/,/g, '.')) || 0;
2009
2167
  const seconds = (pattern === 'DDMMSS') && parts[2] && parseFloat(parts[2].replace(/,/g, '.')) || 0;
2010
2168
  const direction = ((pattern === 'DDMMSS') && parts[3]) || ((pattern === 'DDMM') && parts[2]) || undefined;
2011
2169
  const sign = (direction && (direction === 's' || direction === 'S' || direction === 'w' || direction === 'W')) ? -1 : 1;
2012
2170
  degrees = sign * (degrees + minutes / 60 + seconds / (60 * 60));
2013
- return roundFloat(degrees, maxDecimals);
2171
+ return roundFloat$1(degrees, maxDecimals);
2014
2172
  }
2015
- function roundFloat(input, maxDecimals) {
2173
+ function roundFloat$1(input, maxDecimals) {
2016
2174
  if (maxDecimals > 0) {
2017
2175
  const powDecimal = Math.pow(10, maxDecimals);
2018
2176
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -2032,7 +2190,7 @@ class LatLongFormatPipe {
2032
2190
  return ((!args.type || args.type !== 'latitude') ? formatLongitude : formatLatitude)(value, args);
2033
2191
  }
2034
2192
  }
2035
- LatLongFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LatLongFormatPipe_Factory() { return new LatLongFormatPipe(); }, token: LatLongFormatPipe, providedIn: "root" });
2193
+ LatLongFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function LatLongFormatPipe_Factory() { return new LatLongFormatPipe(); }, token: LatLongFormatPipe, providedIn: "root" });
2036
2194
  LatLongFormatPipe.decorators = [
2037
2195
  { type: Pipe, args: [{
2038
2196
  name: 'latLongFormat'
@@ -2044,7 +2202,7 @@ class LatitudeFormatPipe {
2044
2202
  this.transform = formatLatitude;
2045
2203
  }
2046
2204
  }
2047
- LatitudeFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LatitudeFormatPipe_Factory() { return new LatitudeFormatPipe(); }, token: LatitudeFormatPipe, providedIn: "root" });
2205
+ LatitudeFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function LatitudeFormatPipe_Factory() { return new LatitudeFormatPipe(); }, token: LatitudeFormatPipe, providedIn: "root" });
2048
2206
  LatitudeFormatPipe.decorators = [
2049
2207
  { type: Pipe, args: [{
2050
2208
  name: 'latitudeFormat'
@@ -2056,7 +2214,7 @@ class LongitudeFormatPipe {
2056
2214
  this.transform = formatLongitude;
2057
2215
  }
2058
2216
  }
2059
- LongitudeFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LongitudeFormatPipe_Factory() { return new LongitudeFormatPipe(); }, token: LongitudeFormatPipe, providedIn: "root" });
2217
+ LongitudeFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function LongitudeFormatPipe_Factory() { return new LongitudeFormatPipe(); }, token: LongitudeFormatPipe, providedIn: "root" });
2060
2218
  LongitudeFormatPipe.decorators = [
2061
2219
  { type: Pipe, args: [{
2062
2220
  name: 'longitudeFormat'
@@ -2076,7 +2234,7 @@ class NumberFormatPipe {
2076
2234
  }
2077
2235
  }
2078
2236
  }
2079
- NumberFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2237
+ NumberFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2080
2238
  NumberFormatPipe.decorators = [
2081
2239
  { type: Pipe, args: [{
2082
2240
  name: 'numberFormat'
@@ -2116,7 +2274,7 @@ class HighlightPipe {
2116
2274
  }
2117
2275
  }
2118
2276
  }
2119
- HighlightPipe.ɵprov = ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2277
+ HighlightPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2120
2278
  HighlightPipe.decorators = [
2121
2279
  { type: Pipe, args: [{
2122
2280
  name: 'highlight'
@@ -2181,7 +2339,7 @@ FileSizePipe.decorators = [
2181
2339
  { type: Pipe, args: [{ name: 'fileSize' },] }
2182
2340
  ];
2183
2341
 
2184
- const moment$1 = momentImported;
2342
+ const moment$6 = momentImported;
2185
2343
  const tz = momentTZImported;
2186
2344
  const DATE_UNIX_TIMESTAMP = 'X';
2187
2345
  const DATE_UNIX_MS_TIMESTAMP = 'x';
@@ -2258,32 +2416,32 @@ function fromDateISOString(value) {
2258
2416
  if (!value || isMoment(value))
2259
2417
  return value;
2260
2418
  // Parse the input value, as a ISO date time
2261
- const date = moment$1(value, DATE_ISO_PATTERN);
2419
+ const date = moment$6(value, DATE_ISO_PATTERN);
2262
2420
  if (date.isValid())
2263
2421
  return date;
2264
2422
  // Not valid: trying to convert from unix timestamp
2265
2423
  if (typeof value === 'string') {
2266
2424
  console.warn('Wrong date format - Trying to convert from local time: ' + value);
2267
2425
  if (value.length === 10) {
2268
- return moment$1(value, DATE_UNIX_TIMESTAMP);
2426
+ return moment$6(value, DATE_UNIX_TIMESTAMP);
2269
2427
  }
2270
2428
  else if (value.length === 13) {
2271
- return moment$1(value, DATE_UNIX_MS_TIMESTAMP);
2429
+ return moment$6(value, DATE_UNIX_MS_TIMESTAMP);
2272
2430
  }
2273
2431
  }
2274
2432
  console.warn('Unable to parse date: ' + value);
2275
2433
  return undefined;
2276
2434
  }
2277
2435
  function fromUnixTimestamp(timeInSec) {
2278
- return moment$1(timeInSec, DATE_UNIX_TIMESTAMP);
2436
+ return moment$6(timeInSec, DATE_UNIX_TIMESTAMP);
2279
2437
  }
2280
2438
  function fromUnixMsTimestamp(timeInMs) {
2281
- return moment$1(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2439
+ return moment$6(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2282
2440
  }
2283
2441
  function toDuration(value, unit) {
2284
2442
  if (!value)
2285
2443
  return undefined;
2286
- const duration = moment$1.duration(value, unit);
2444
+ const duration = moment$6.duration(value, unit);
2287
2445
  // fix 990+ ms
2288
2446
  if (duration.milliseconds() >= 990) {
2289
2447
  duration.add(1000 - duration.milliseconds(), 'ms');
@@ -2312,7 +2470,7 @@ class DurationPipe {
2312
2470
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + hour + ':' + minute;
2313
2471
  }
2314
2472
  }
2315
- DurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(ɵɵinject(TranslateService)); }, token: DurationPipe, providedIn: "root" });
2473
+ DurationPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(i0.ɵɵinject(i1$1.TranslateService)); }, token: DurationPipe, providedIn: "root" });
2316
2474
  DurationPipe.decorators = [
2317
2475
  { type: Pipe, args: [{
2318
2476
  name: 'duration'
@@ -2333,7 +2491,7 @@ class MathAbsPipe {
2333
2491
  }
2334
2492
  }
2335
2493
  }
2336
- MathAbsPipe.ɵprov = ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2494
+ MathAbsPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2337
2495
  MathAbsPipe.decorators = [
2338
2496
  { type: Pipe, args: [{
2339
2497
  name: 'mathAbs'
@@ -2345,7 +2503,7 @@ class EvenPipe {
2345
2503
  return val % 2 === 0;
2346
2504
  }
2347
2505
  }
2348
- EvenPipe.ɵprov = ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2506
+ EvenPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2349
2507
  EvenPipe.decorators = [
2350
2508
  { type: Pipe, args: [{
2351
2509
  name: 'even'
@@ -2357,7 +2515,7 @@ class OddPipe {
2357
2515
  return val % 2 !== 0;
2358
2516
  }
2359
2517
  }
2360
- OddPipe.ɵprov = ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2518
+ OddPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2361
2519
  OddPipe.decorators = [
2362
2520
  { type: Pipe, args: [{
2363
2521
  name: 'odd'
@@ -2465,7 +2623,7 @@ class MapGetPipe {
2465
2623
  return val[key];
2466
2624
  }
2467
2625
  }
2468
- MapGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2626
+ MapGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2469
2627
  MapGetPipe.decorators = [
2470
2628
  { type: Pipe, args: [{
2471
2629
  name: 'mapGet'
@@ -2479,7 +2637,7 @@ class MapKeysPipe {
2479
2637
  return Object.keys(map);
2480
2638
  }
2481
2639
  }
2482
- MapKeysPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2640
+ MapKeysPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2483
2641
  MapKeysPipe.decorators = [
2484
2642
  { type: Pipe, args: [{
2485
2643
  name: 'mapKeys'
@@ -2493,7 +2651,7 @@ class MapValuesPipe {
2493
2651
  return Object.values(map);
2494
2652
  }
2495
2653
  }
2496
- MapValuesPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2654
+ MapValuesPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2497
2655
  MapValuesPipe.decorators = [
2498
2656
  { type: Pipe, args: [{
2499
2657
  name: 'mapValues'
@@ -2506,7 +2664,7 @@ class IsNotNilOrBlankPipe {
2506
2664
  return isNotNilOrBlank(value);
2507
2665
  }
2508
2666
  }
2509
- IsNotNilOrBlankPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotNilOrBlankPipe_Factory() { return new IsNotNilOrBlankPipe(); }, token: IsNotNilOrBlankPipe, providedIn: "root" });
2667
+ IsNotNilOrBlankPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotNilOrBlankPipe_Factory() { return new IsNotNilOrBlankPipe(); }, token: IsNotNilOrBlankPipe, providedIn: "root" });
2510
2668
  IsNotNilOrBlankPipe.decorators = [
2511
2669
  { type: Pipe, args: [{
2512
2670
  name: 'isNotNilOrBlank'
@@ -2518,7 +2676,7 @@ class IsNilOrBlankPipe {
2518
2676
  return isNilOrBlank(value);
2519
2677
  }
2520
2678
  }
2521
- IsNilOrBlankPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNilOrBlankPipe_Factory() { return new IsNilOrBlankPipe(); }, token: IsNilOrBlankPipe, providedIn: "root" });
2679
+ IsNilOrBlankPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNilOrBlankPipe_Factory() { return new IsNilOrBlankPipe(); }, token: IsNilOrBlankPipe, providedIn: "root" });
2522
2680
  IsNilOrBlankPipe.decorators = [
2523
2681
  { type: Pipe, args: [{
2524
2682
  name: 'isNilOrBlank'
@@ -2530,7 +2688,7 @@ class ToStringPipe {
2530
2688
  return (value !== null && value !== undefined) ? value.toString() : '';
2531
2689
  }
2532
2690
  }
2533
- ToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function ToStringPipe_Factory() { return new ToStringPipe(); }, token: ToStringPipe, providedIn: "root" });
2691
+ ToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function ToStringPipe_Factory() { return new ToStringPipe(); }, token: ToStringPipe, providedIn: "root" });
2534
2692
  ToStringPipe.decorators = [
2535
2693
  { type: Pipe, args: [{
2536
2694
  name: 'toString'
@@ -2542,7 +2700,7 @@ class StrLengthPipe {
2542
2700
  return value && value.length || 0;
2543
2701
  }
2544
2702
  }
2545
- StrLengthPipe.ɵprov = ɵɵdefineInjectable({ factory: function StrLengthPipe_Factory() { return new StrLengthPipe(); }, token: StrLengthPipe, providedIn: "root" });
2703
+ StrLengthPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function StrLengthPipe_Factory() { return new StrLengthPipe(); }, token: StrLengthPipe, providedIn: "root" });
2546
2704
  StrLengthPipe.decorators = [
2547
2705
  { type: Pipe, args: [{
2548
2706
  name: 'strLength'
@@ -2554,7 +2712,7 @@ class StrIncludesPipe {
2554
2712
  return (value === null || value === void 0 ? void 0 : value.includes(searchString, position)) || false;
2555
2713
  }
2556
2714
  }
2557
- StrIncludesPipe.ɵprov = ɵɵdefineInjectable({ factory: function StrIncludesPipe_Factory() { return new StrIncludesPipe(); }, token: StrIncludesPipe, providedIn: "root" });
2715
+ StrIncludesPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function StrIncludesPipe_Factory() { return new StrIncludesPipe(); }, token: StrIncludesPipe, providedIn: "root" });
2558
2716
  StrIncludesPipe.decorators = [
2559
2717
  { type: Pipe, args: [{
2560
2718
  name: 'strIncludes'
@@ -2631,7 +2789,7 @@ class TranslateContextService {
2631
2789
  return translations[keys[keys.length - 1]]; // Return the last keys translation
2632
2790
  }
2633
2791
  }
2634
- TranslateContextService.ɵprov = ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(ɵɵinject(TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2792
+ TranslateContextService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(i0.ɵɵinject(i1$1.TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2635
2793
  TranslateContextService.decorators = [
2636
2794
  { type: Injectable, args: [{ providedIn: 'root' },] }
2637
2795
  ];
@@ -2681,7 +2839,7 @@ class PropertyGetPipe {
2681
2839
  args && args.defaultValue);
2682
2840
  }
2683
2841
  }
2684
- PropertyGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function PropertyGetPipe_Factory() { return new PropertyGetPipe(); }, token: PropertyGetPipe, providedIn: "root" });
2842
+ PropertyGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PropertyGetPipe_Factory() { return new PropertyGetPipe(); }, token: PropertyGetPipe, providedIn: "root" });
2685
2843
  PropertyGetPipe.decorators = [
2686
2844
  { type: Pipe, args: [{
2687
2845
  name: 'propertyGet'
@@ -2706,7 +2864,7 @@ NgInitDirective.propDecorators = {
2706
2864
  ngInit: [{ type: Output }]
2707
2865
  };
2708
2866
 
2709
- const moment$2 = momentImported;
2867
+ const moment$5 = momentImported;
2710
2868
  // @dynamic
2711
2869
  class SharedValidators {
2712
2870
  static getDoubleRegexp(maxDecimals) {
@@ -2787,7 +2945,7 @@ class SharedValidators {
2787
2945
  }
2788
2946
  static validDate(control) {
2789
2947
  const value = control.value;
2790
- const date = !value || moment$2.isMoment(value) ? value : moment$2(control.value, DATE_ISO_PATTERN);
2948
+ const date = !value || moment$5.isMoment(value) ? value : moment$5(control.value, DATE_ISO_PATTERN);
2791
2949
  if (date && (!date.isValid() || date.year() < 1970)) {
2792
2950
  return { validDate: true };
2793
2951
  }
@@ -3899,7 +4057,7 @@ class FormErrorTranslator {
3899
4057
  return errorKey;
3900
4058
  }
3901
4059
  }
3902
- FormErrorTranslator.ɵprov = ɵɵdefineInjectable({ factory: function FormErrorTranslator_Factory() { return new FormErrorTranslator(ɵɵinject(TranslateService), ɵɵinject(APP_FORM_ERROR_I18N_KEYS, 8)); }, token: FormErrorTranslator, providedIn: "root" });
4060
+ 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" });
3903
4061
  FormErrorTranslator.decorators = [
3904
4062
  { type: Injectable, args: [{ providedIn: 'root' },] }
3905
4063
  ];
@@ -3979,7 +4137,7 @@ class FormGetPipe {
3979
4137
  return form.get(path);
3980
4138
  }
3981
4139
  }
3982
- FormGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetPipe_Factory() { return new FormGetPipe(); }, token: FormGetPipe, providedIn: "root" });
4140
+ FormGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormGetPipe_Factory() { return new FormGetPipe(); }, token: FormGetPipe, providedIn: "root" });
3983
4141
  FormGetPipe.decorators = [
3984
4142
  { type: Pipe, args: [{
3985
4143
  name: 'formGet'
@@ -3991,7 +4149,7 @@ class FormGetControlPipe {
3991
4149
  return form.get(path);
3992
4150
  }
3993
4151
  }
3994
- FormGetControlPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetControlPipe_Factory() { return new FormGetControlPipe(); }, token: FormGetControlPipe, providedIn: "root" });
4152
+ FormGetControlPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormGetControlPipe_Factory() { return new FormGetControlPipe(); }, token: FormGetControlPipe, providedIn: "root" });
3995
4153
  FormGetControlPipe.decorators = [
3996
4154
  { type: Pipe, args: [{
3997
4155
  name: 'formGetControl'
@@ -4003,7 +4161,7 @@ class FormGetArrayPipe {
4003
4161
  return form.get(path);
4004
4162
  }
4005
4163
  }
4006
- FormGetArrayPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetArrayPipe_Factory() { return new FormGetArrayPipe(); }, token: FormGetArrayPipe, providedIn: "root" });
4164
+ FormGetArrayPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormGetArrayPipe_Factory() { return new FormGetArrayPipe(); }, token: FormGetArrayPipe, providedIn: "root" });
4007
4165
  FormGetArrayPipe.decorators = [
4008
4166
  { type: Pipe, args: [{
4009
4167
  name: 'formGetArray'
@@ -4015,7 +4173,7 @@ class FormGetGroupPipe {
4015
4173
  return form.get(path);
4016
4174
  }
4017
4175
  }
4018
- FormGetGroupPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetGroupPipe_Factory() { return new FormGetGroupPipe(); }, token: FormGetGroupPipe, providedIn: "root" });
4176
+ FormGetGroupPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormGetGroupPipe_Factory() { return new FormGetGroupPipe(); }, token: FormGetGroupPipe, providedIn: "root" });
4019
4177
  FormGetGroupPipe.decorators = [
4020
4178
  { type: Pipe, args: [{
4021
4179
  name: 'formGetGroup'
@@ -4135,7 +4293,7 @@ const isIpad = (win) => {
4135
4293
  }
4136
4294
  return false;
4137
4295
  };
4138
- const ɵ0$1 = isIpad;
4296
+ const ɵ0$b = isIpad;
4139
4297
  const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
4140
4298
  const isAndroid = (win) => testUserAgent(win, /android|sink/i);
4141
4299
  const isCordova = (win) => !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);
@@ -4370,9 +4528,9 @@ function parseDuration(input, maxDecimals, placeholderChar) {
4370
4528
  const hour = parseInt(durationParts[0] || '0');
4371
4529
  const minute = parseInt(durationParts[1] || '0');
4372
4530
  const value = hour + (minute + 0.5) / 60;
4373
- return roundFloat$1(value, maxDecimals);
4531
+ return roundFloat(value, maxDecimals);
4374
4532
  }
4375
- function roundFloat$1(input, maxDecimals) {
4533
+ function roundFloat(input, maxDecimals) {
4376
4534
  if (maxDecimals > 0) {
4377
4535
  const powDecimal = Math.pow(10, maxDecimals);
4378
4536
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -4396,9 +4554,9 @@ const MASKS = {
4396
4554
  DD: [/[+-]/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '°']
4397
4555
  }
4398
4556
  };
4399
- const noop$1 = () => {
4557
+ const noop$7 = () => {
4400
4558
  };
4401
- const ɵ0$2 = noop$1;
4559
+ const ɵ0$a = noop$7;
4402
4560
  class MatLatLongField {
4403
4561
  constructor(platform, translate, formBuilder, cd, formGroupDir) {
4404
4562
  this.platform = platform;
@@ -4406,8 +4564,8 @@ class MatLatLongField {
4406
4564
  this.formBuilder = formBuilder;
4407
4565
  this.cd = cd;
4408
4566
  this.formGroupDir = formGroupDir;
4409
- this._onChangeCallback = noop$1;
4410
- this._onTouchedCallback = noop$1;
4567
+ this._onChangeCallback = noop$7;
4568
+ this._onTouchedCallback = noop$7;
4411
4569
  this._subscription = new Subscription();
4412
4570
  this.disabling = false;
4413
4571
  this.writing = false;
@@ -4744,14 +4902,14 @@ SharedMatLatLongModule.decorators = [
4744
4902
  },] }
4745
4903
  ];
4746
4904
 
4747
- const DEFAULT_VALUE_ACCESSOR = {
4905
+ const DEFAULT_VALUE_ACCESSOR$5 = {
4748
4906
  provide: NG_VALUE_ACCESSOR,
4749
4907
  useExisting: forwardRef(() => MatDate),
4750
4908
  multi: true
4751
4909
  };
4752
- const DAY_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
4753
- const noop$2 = () => { };
4754
- const ɵ0$3 = noop$2;
4910
+ const DAY_MASK$2 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
4911
+ const noop$6 = () => { };
4912
+ const ɵ0$9 = noop$6;
4755
4913
  class MatDate {
4756
4914
  constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
4757
4915
  this.platform = platform;
@@ -4761,13 +4919,13 @@ class MatDate {
4761
4919
  this.cd = cd;
4762
4920
  this.keyboard = keyboard;
4763
4921
  this.formGroupDir = formGroupDir;
4764
- this._onChangeCallback = noop$2;
4765
- this._onTouchedCallback = noop$2;
4922
+ this._onChangeCallback = noop$6;
4923
+ this._onTouchedCallback = noop$6;
4766
4924
  this._subscription = new Subscription();
4767
4925
  this._writing = true;
4768
4926
  this._disabling = false;
4769
4927
  this._readonly = false;
4770
- this.dayMask = DAY_MASK;
4928
+ this.dayMask = DAY_MASK$2;
4771
4929
  this.floatLabel = 'auto';
4772
4930
  this.compact = false;
4773
4931
  this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
@@ -5054,7 +5212,7 @@ MatDate.decorators = [
5054
5212
  selector: 'mat-date-field',
5055
5213
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\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 -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\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\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\">\n <ng-container [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</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 </ng-container>\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",
5056
5214
  providers: [
5057
- DEFAULT_VALUE_ACCESSOR,
5215
+ DEFAULT_VALUE_ACCESSOR$5,
5058
5216
  ],
5059
5217
  changeDetection: ChangeDetectionStrategy.OnPush,
5060
5218
  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%}"]
@@ -5089,16 +5247,16 @@ MatDate.propDecorators = {
5089
5247
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5090
5248
  };
5091
5249
 
5092
- const DEFAULT_VALUE_ACCESSOR$1 = {
5250
+ const DEFAULT_VALUE_ACCESSOR$4 = {
5093
5251
  provide: NG_VALUE_ACCESSOR,
5094
5252
  useExisting: forwardRef(() => MatDateTime),
5095
5253
  multi: true
5096
5254
  };
5097
5255
  const DAY_MASK$1 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5098
5256
  const HOUR_REGEXP = /^[012][0-9][:][012345][0-9]$/;
5099
- const HOUR_MASK = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5100
- const noop$3 = () => { };
5101
- const ɵ0$4 = noop$3;
5257
+ const HOUR_MASK$1 = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5258
+ const noop$5 = () => { };
5259
+ const ɵ0$8 = noop$5;
5102
5260
  class MatDateTime {
5103
5261
  constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5104
5262
  this.platform = platform;
@@ -5108,14 +5266,14 @@ class MatDateTime {
5108
5266
  this.cd = cd;
5109
5267
  this.keyboard = keyboard;
5110
5268
  this.formGroupDir = formGroupDir;
5111
- this._onChangeCallback = noop$3;
5112
- this._onTouchedCallback = noop$3;
5269
+ this._onChangeCallback = noop$5;
5270
+ this._onTouchedCallback = noop$5;
5113
5271
  this._subscription = new Subscription();
5114
5272
  this._writing = true;
5115
5273
  this._disabling = false;
5116
5274
  this._readonly = false;
5117
5275
  this.dayMask = DAY_MASK$1;
5118
- this.hourMask = HOUR_MASK;
5276
+ this.hourMask = HOUR_MASK$1;
5119
5277
  this.floatLabel = 'auto';
5120
5278
  this.compact = false;
5121
5279
  this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
@@ -5428,7 +5586,7 @@ MatDateTime.decorators = [
5428
5586
  selector: 'mat-date-time-field',
5429
5587
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\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\">\n <ion-row class=\"ion-no-padding no-wrap\" nowrap>\n\n <!-- day -->\n <ion-col class=\"day ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\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 [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",
5430
5588
  providers: [
5431
- DEFAULT_VALUE_ACCESSOR$1,
5589
+ DEFAULT_VALUE_ACCESSOR$4,
5432
5590
  ],
5433
5591
  changeDetection: ChangeDetectionStrategy.OnPush,
5434
5592
  styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field .datetime-md{padding:0!important}ion-row.no-wrap{flex-wrap:nowrap}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field input[type=text],ion-col.hour mat-form-field mat-label{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}"]
@@ -5463,15 +5621,15 @@ MatDateTime.propDecorators = {
5463
5621
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5464
5622
  };
5465
5623
 
5466
- const DEFAULT_VALUE_ACCESSOR$2 = {
5624
+ const DEFAULT_VALUE_ACCESSOR$3 = {
5467
5625
  provide: NG_VALUE_ACCESSOR,
5468
5626
  useExisting: forwardRef(() => MatDateShort),
5469
5627
  multi: true
5470
5628
  };
5471
- const DAY_MASK$2 = [/\d/, /\d/, /\d/, /\d/];
5629
+ const DAY_MASK = [/\d/, /\d/, /\d/, /\d/];
5472
5630
  const noop$4 = () => {
5473
5631
  };
5474
- const ɵ0$5 = noop$4;
5632
+ const ɵ0$7 = noop$4;
5475
5633
  class MatDateShort {
5476
5634
  constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5477
5635
  this.dateAdapter = dateAdapter;
@@ -5484,7 +5642,7 @@ class MatDateShort {
5484
5642
  this._onTouchedCallback = noop$4;
5485
5643
  this.writing = true;
5486
5644
  this.disabling = false;
5487
- this.dayMask = DAY_MASK$2;
5645
+ this.dayMask = DAY_MASK;
5488
5646
  this.disabled = false;
5489
5647
  this.floatLabel = 'auto';
5490
5648
  this.readonly = false;
@@ -5729,7 +5887,7 @@ MatDateShort.decorators = [
5729
5887
  selector: 'mat-date-short-field',
5730
5888
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_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.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('validDate')\" translate>ERROR.FIELD_NOT_VALID_DATE</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateIsAfter')\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateRange')\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMaxDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMinDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngIf=\"formControl.hasError('msg')\">{{formControl.errors.msg}}</mat-error>\n <ng-content select=\"mat-error\"></ng-content>\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",
5731
5889
  providers: [
5732
- DEFAULT_VALUE_ACCESSOR$2,
5890
+ DEFAULT_VALUE_ACCESSOR$3,
5733
5891
  ],
5734
5892
  changeDetection: ChangeDetectionStrategy.OnPush,
5735
5893
  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%}"]
@@ -5797,16 +5955,16 @@ SharedMatDateTimeModule.decorators = [
5797
5955
  },] }
5798
5956
  ];
5799
5957
 
5800
- const DEFAULT_VALUE_ACCESSOR$3 = {
5958
+ const DEFAULT_VALUE_ACCESSOR$2 = {
5801
5959
  provide: NG_VALUE_ACCESSOR,
5802
5960
  useExisting: forwardRef(() => MatDuration),
5803
5961
  multi: true
5804
5962
  };
5805
5963
  const HOUR_TIME_PATTERN = /[0-9]\d\d:[0-5]\d/;
5806
- const HOUR_MASK$1 = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
5807
- const noop$5 = () => {
5964
+ const HOUR_MASK = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
5965
+ const noop$3 = () => {
5808
5966
  };
5809
- const ɵ0$6 = noop$5;
5967
+ const ɵ0$6 = noop$3;
5810
5968
  class MatDuration {
5811
5969
  constructor(platform, dateAdapter, translate, formBuilder, cd, formGroupDir) {
5812
5970
  this.dateAdapter = dateAdapter;
@@ -5815,11 +5973,11 @@ class MatDuration {
5815
5973
  this.cd = cd;
5816
5974
  this.formGroupDir = formGroupDir;
5817
5975
  this._subscription = new Subscription();
5818
- this._onChangeCallback = noop$5;
5819
- this._onTouchedCallback = noop$5;
5976
+ this._onChangeCallback = noop$3;
5977
+ this._onTouchedCallback = noop$3;
5820
5978
  this.writing = true;
5821
5979
  this.disabling = false;
5822
- this.hourMask = HOUR_MASK$1;
5980
+ this.hourMask = HOUR_MASK;
5823
5981
  this.disabled = false;
5824
5982
  this.floatLabel = 'auto';
5825
5983
  this.readonly = false;
@@ -5999,7 +6157,7 @@ MatDuration.decorators = [
5999
6157
  selector: 'mat-duration-field',
6000
6158
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{ formControl.value|duration }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"formControl.disabled\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput type=\"text\"\n autocomplete=\"off\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.DURATION_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keydown.tab)=\"moveCaretToSeparator($event, true)\"\n (keydown.shift.tab)=\"moveCaretToSeparator($event, false)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n\n <!-- errors -->\n <mat-error *ngIf=\"!formControl.hasError('required') && textControl.hasError('pattern')\" translate>ERROR.FIELD_NOT_VALID_PATTERN</mat-error>\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{(compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate:formControl.errors.min }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{(compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate:formControl.errors.max }}</mat-error>\n\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n</ng-template>\n\n",
6001
6159
  providers: [
6002
- DEFAULT_VALUE_ACCESSOR$3,
6160
+ DEFAULT_VALUE_ACCESSOR$2,
6003
6161
  ],
6004
6162
  changeDetection: ChangeDetectionStrategy.OnPush,
6005
6163
  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%}"]
@@ -6056,22 +6214,22 @@ SharedMatDurationModule.decorators = [
6056
6214
  },] }
6057
6215
  ];
6058
6216
 
6059
- const DEFAULT_VALUE_ACCESSOR$4 = {
6217
+ const DEFAULT_VALUE_ACCESSOR$1 = {
6060
6218
  provide: NG_VALUE_ACCESSOR,
6061
6219
  useExisting: forwardRef(() => MatBooleanField),
6062
6220
  multi: true
6063
6221
  };
6064
- const noop$6 = () => {
6222
+ const noop$2 = () => {
6065
6223
  };
6066
- const ɵ0$7 = noop$6;
6224
+ const ɵ0$5 = noop$2;
6067
6225
  class MatBooleanField {
6068
6226
  constructor(translate, formBuilder, cd, formGroupDir) {
6069
6227
  this.translate = translate;
6070
6228
  this.formBuilder = formBuilder;
6071
6229
  this.cd = cd;
6072
6230
  this.formGroupDir = formGroupDir;
6073
- this._onChangeCallback = noop$6;
6074
- this._onTouchedCallback = noop$6;
6231
+ this._onChangeCallback = noop$2;
6232
+ this._onTouchedCallback = noop$2;
6075
6233
  this._writing = false;
6076
6234
  this.showRadio = false;
6077
6235
  this.disabled = false;
@@ -6234,7 +6392,7 @@ MatBooleanField.decorators = [
6234
6392
  selector: 'mat-boolean-field',
6235
6393
  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>{{(formControl.value == null && 'COMMON.EMPTY_OPTION' || (formControl.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 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 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===undefined\"\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 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",
6236
6394
  providers: [
6237
- DEFAULT_VALUE_ACCESSOR$4
6395
+ DEFAULT_VALUE_ACCESSOR$1
6238
6396
  ],
6239
6397
  changeDetection: ChangeDetectionStrategy.OnPush,
6240
6398
  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}"]
@@ -6480,7 +6638,7 @@ class MatNumpadDomService {
6480
6638
  this.appRef.detachView(this.componentRef.hostView);
6481
6639
  }
6482
6640
  }
6483
- MatNumpadDomService.ɵprov = ɵɵdefineInjectable({ factory: function MatNumpadDomService_Factory() { return new MatNumpadDomService(ɵɵinject(ComponentFactoryResolver), ɵɵinject(ApplicationRef), ɵɵinject(INJECTOR), ɵɵinject(DOCUMENT, 8)); }, token: MatNumpadDomService, providedIn: "root" });
6641
+ 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" });
6484
6642
  MatNumpadDomService.decorators = [
6485
6643
  { type: Injectable, args: [{
6486
6644
  providedIn: 'root'
@@ -6844,7 +7002,7 @@ SharedMatNumpadModule.decorators = [
6844
7002
  },] }
6845
7003
  ];
6846
7004
 
6847
- const DEFAULT_VALUE_ACCESSOR$5 = {
7005
+ const DEFAULT_VALUE_ACCESSOR = {
6848
7006
  provide: NG_VALUE_ACCESSOR,
6849
7007
  useExisting: forwardRef(() => MatSwipeField),
6850
7008
  multi: true
@@ -7107,7 +7265,7 @@ MatSwipeField.decorators = [
7107
7265
  { type: Component, args: [{
7108
7266
  selector: 'mat-swipe-field',
7109
7267
  template: "<mat-form-field [floatLabel]=\"showSlides && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n [class]=\"classList\"\n [class.mat-form-field-disabled]=\"disabled\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n </mat-label>\n <input matInput #fakeInput type=\"text\"\n [formControl]=\"formControl\"\n [readonly]=\"true\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showSlides\"\n [tabindex]=\"tabindex\">\n\n <div class=\"slides-container\" [class.hidden]=\"!showSlides\">\n <ion-slides #slides\n [options]=\"slidesOptions\"\n (ionSlidesDidLoad)=\"slidesLoaded()\"\n (ionSlideReachStart)=\"reachStart(true)\"\n (ionSlideReachEnd)=\"reachEnd(true)\"\n (ionSlideNextEnd)=\"reachStart(false)\"\n (ionSlidePrevEnd)=\"reachEnd(false)\"\n (ionSlideDidChange)=\"slideChanged()\"\n >\n <ion-slide *ngFor=\"let item of $items | async\">\n <ion-label>{{ displayWith(item) }}</ion-label>\n </ion-slide>\n\n </ion-slides>\n </div>\n\n <button #prevButton\n mat-icon-button\n type=\"button\"\n class=\"button-prev\"\n [hidden]=\"!showSlides\"\n [disabled]=\"previousDisabled\"\n (click)=\"previous()\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button #nextButton\n mat-icon-button\n type=\"button\"\n class=\"button-next\"\n [hidden]=\"!showSlides\"\n [disabled]=\"nextDisabled\"\n (click)=\"next()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n\n</mat-form-field>\n",
7110
- providers: [DEFAULT_VALUE_ACCESSOR$5],
7268
+ providers: [DEFAULT_VALUE_ACCESSOR],
7111
7269
  changeDetection: ChangeDetectionStrategy.OnPush,
7112
7270
  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}"]
7113
7271
  },] }
@@ -7165,14 +7323,14 @@ SharedMatSwipeModule.decorators = [
7165
7323
  },] }
7166
7324
  ];
7167
7325
 
7168
- const noop$7 = () => { };
7169
- const ɵ0$8 = noop$7;
7326
+ const noop$1 = () => { };
7327
+ const ɵ0$4 = noop$1;
7170
7328
  class MatChipsField {
7171
7329
  constructor(cd, formGroupDir) {
7172
7330
  this.cd = cd;
7173
7331
  this.formGroupDir = formGroupDir;
7174
- this._onChangeCallback = noop$7;
7175
- this._onTouchedCallback = noop$7;
7332
+ this._onChangeCallback = noop$1;
7333
+ this._onTouchedCallback = noop$1;
7176
7334
  this.logPrefix = '[mat-chips] ';
7177
7335
  this.formControlName = null;
7178
7336
  this.required = false;
@@ -7293,9 +7451,9 @@ class MatChipsField {
7293
7451
  // - if label then col size = 2
7294
7452
  // - if rankOrder then col size = 1
7295
7453
  // - ese => auto size
7296
- || this.displayAttributes.map(attr => (attr && attr.endsWith('label')) ? 2
7297
- : ((attr && attr.endsWith('rankOrder')) ? 1
7298
- : undefined));
7454
+ || this.displayAttributes.map(attr => attr && (attr.endsWith('label') ? 3
7455
+ : (attr.endsWith('rankOrder') ? 2
7456
+ : undefined)));
7299
7457
  this.displayColumnNames = this.displayAttributes.map((attr, index) => this.displayColumnNames && this.displayColumnNames[index] ||
7300
7458
  (this.i18nPrefix + changeCaseToUnderscore(attr).toUpperCase()));
7301
7459
  this.mobile = toBoolean(this.mobile, false);
@@ -7313,18 +7471,18 @@ class MatChipsField {
7313
7471
  // No suggestFn: filter on the given items
7314
7472
  if (!this.suggestFn) {
7315
7473
  const suggestFromArrayFn = (value, filter) => __awaiter(this, void 0, void 0, function* () {
7316
- if (this.debug)
7317
- console.debug(this.logPrefix + ' Calling suggestFromArray with value=', value);
7474
+ // DEBUG
7475
+ //if (this.debug) console.debug(this.logPrefix + ' Calling suggestFromArray with value=', value);
7318
7476
  return suggestFromArray(this.$inputItems.value, value, Object.assign({ searchAttributes: this.displayAttributes }, filter));
7319
7477
  });
7320
7478
  // Wait (once) that items are loaded, then call suggest from array fn
7321
7479
  this.suggestFn = (value, filter) => __awaiter(this, void 0, void 0, function* () {
7322
7480
  if (isNil(this.$inputItems.value)) {
7323
- if (this.debug)
7324
- console.debug('[mat-chips] Waiting items to be set...');
7481
+ // DEBUG
7482
+ //if (this.debug) console.debug('[mat-chips] Waiting items to be set...');
7325
7483
  yield firstNotNilPromise(this.$inputItems);
7326
- if (this.debug)
7327
- console.debug('[mat-chips] Received items:', this.$inputItems.value);
7484
+ // DEBUG
7485
+ //if (this.debug) console.debug('[mat-chips] Received items:', this.$inputItems.value);
7328
7486
  }
7329
7487
  this.suggestFn = suggestFromArrayFn;
7330
7488
  return this.suggestFn(value, filter); // Loop
@@ -7353,9 +7511,7 @@ class MatChipsField {
7353
7511
  ),
7354
7512
  // Object set: use it (no distinctUntilChanged() pipe need)
7355
7513
  this.inputControl.valueChanges
7356
- .pipe(startWith(this.inputControl.value), filter(value => isNotNil(value) && typeof value === 'object'),
7357
- // DEBUG
7358
- tap(value => this.debug && console.debug(this.logPrefix + ' Received an object value: ', value))),
7514
+ .pipe(startWith(this.inputControl.value), filter(value => isNotNil(value) && typeof value === 'object')),
7359
7515
  // On dropdown button click (no distinctUntilChanged(), nor debounceTime)
7360
7516
  this.dropButtonClick
7361
7517
  .pipe(filter(event => this.enabled && (!event || !event.defaultPrevented)), tap(_ => this.matInputText.nativeElement.focus()), map(_ => this.showAllOnFocus ? '*' : this.formControl.value),
@@ -7428,6 +7584,7 @@ class MatChipsField {
7428
7584
  this.$filteredItems.next(undefined);
7429
7585
  }
7430
7586
  this._implicitValue = null; // reset the implicit value
7587
+ this.closePanel(); // Clone panel
7431
7588
  }));
7432
7589
  // Listen form control status change
7433
7590
  this._subscription.add(this.formControl.statusChanges
@@ -7438,6 +7595,7 @@ class MatChipsField {
7438
7595
  .subscribe(() => this.checkIfTouched()));
7439
7596
  this._subscription.add(this.keydownEscape.subscribe(event => {
7440
7597
  if (this.isOpen) {
7598
+ // Avoid form or page to manage escape event
7441
7599
  event === null || event === void 0 ? void 0 : event.stopPropagation();
7442
7600
  event === null || event === void 0 ? void 0 : event.preventDefault();
7443
7601
  // DEBUG
@@ -7525,8 +7683,8 @@ class MatChipsField {
7525
7683
  value = [value];
7526
7684
  }
7527
7685
  if (value !== this.formControl.value) {
7528
- if (this.debug)
7529
- console.debug(this.logPrefix + ' Writing value: ', value);
7686
+ // DEBUG
7687
+ //if (this.debug) console.debug(this.logPrefix + ' Writing value: ', value);
7530
7688
  this.formControl.patchValue(value, { emitEvent: false });
7531
7689
  this._onChangeCallback(value);
7532
7690
  }
@@ -7559,15 +7717,17 @@ class MatChipsField {
7559
7717
  if (event.stopPropagation)
7560
7718
  event.stopPropagation();
7561
7719
  event.returnValue = false;
7562
- if (this.debug)
7563
- console.debug(this.logPrefix + ' Cancelling focus event');
7720
+ // DEBUG
7721
+ //if (this.debug) console.debug(this.logPrefix + ' Cancelling focus event');
7564
7722
  return false;
7565
7723
  }
7724
+ // DEBUG
7725
+ //if (this.debug) console.debug(this.logPrefix + ' Select input content');
7566
7726
  const hasContent = selectInputContent(event);
7567
7727
  // If combo is empty, or if has content but should force to show panel on focus
7568
7728
  if (!hasContent || (this.showPanelOnFocus && this.showAllOnFocus)) {
7569
- if (this.debug)
7570
- console.debug(this.logPrefix + ' Emit focus event');
7729
+ // DEBUG
7730
+ //if (this.debug) console.debug(this.logPrefix + ' Emit focus event');
7571
7731
  this.focused.emit(event);
7572
7732
  return true;
7573
7733
  }
@@ -7582,11 +7742,12 @@ class MatChipsField {
7582
7742
  if (event.stopPropagation)
7583
7743
  event.stopPropagation();
7584
7744
  event.returnValue = false;
7585
- //DEBUG console.debug(this.logPrefix + " Cancelling blur event");
7745
+ //DEBUG
7746
+ //if (this.debug) console.debug(this.logPrefix + " Cancelling blur event");
7586
7747
  return false;
7587
7748
  }
7588
- //DEBUG
7589
- //console.debug(this.logPrefix + ' Blur: move caret to the beginning');
7749
+ // DEBUG
7750
+ //if (this.debug) console.debug(this.logPrefix + ' Blur: move caret to the beginning');
7590
7751
  // Move caret to the beginning (fix issue IMAGINE-469)
7591
7752
  selectInputRange(event.target, 0, 0);
7592
7753
  this.blurred.emit(event);
@@ -7724,7 +7885,7 @@ MatChipsField.decorators = [
7724
7885
  { type: Component, args: [{
7725
7886
  // eslint-disable-next-line @angular-eslint/component-selector
7726
7887
  selector: 'mat-chips-field',
7727
- template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\" class=\"material-chips\" [class.mat-form-field-disabled]=\"disabled\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <mat-label>{{placeholder}}</mat-label>\n <mat-chip-list #chipList\n (focus)=\"filterChipsFocusEvent($event)\" >\n <mat-chip\n *ngFor=\"let item of value\"\n [selectable]=\"false\"\n [removable]=\"!disabled\"\n (removed)=\"remove(item)\"\n [color]=\"chipColor\"\n >\n {{displayWith(item)}}\n <mat-icon matChipRemove *ngIf=\"!disabled\">cancel</mat-icon>\n </mat-chip>\n\n <input #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"inputControl\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [readonly]=\"disabled\"\n [hidden]=\"disabled\"\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 [matChipInputFor]=\"chipList\"\n >\n </mat-chip-list>\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n (optionSelected)=\"add($event)\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i; last as last\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n <ion-text color=\"light\" *ngIf=\"last && itemCount; let count\" class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n <ng-container *ngIf=\"$filteredItems | async; else loadingTemplate; let items\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label>{{noResultMessage | translate}}</ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: inputControl.value, withAccent: highlightAccent } \"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(matInputText.value | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n\n <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 <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n\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 mat-icon-button tabindex=\"-1\"\n type=\"button\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button 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",
7888
+ template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\" class=\"material-chips\" [class.mat-form-field-disabled]=\"disabled\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <mat-label>{{placeholder}}</mat-label>\n <mat-chip-list #chipList\n (focus)=\"filterChipsFocusEvent($event)\" >\n <mat-chip\n *ngFor=\"let item of value\"\n [selectable]=\"false\"\n [removable]=\"!disabled\"\n (removed)=\"remove(item)\"\n [color]=\"chipColor\"\n >\n {{displayWith(item)}}\n <mat-icon matChipRemove *ngIf=\"!disabled\">cancel</mat-icon>\n </mat-chip>\n\n <input #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"inputControl\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [readonly]=\"disabled\"\n [hidden]=\"disabled\"\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 [matChipInputFor]=\"chipList\"\n >\n </mat-chip-list>\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n (optionSelected)=\"add($event)\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <ion-row class=\"mat-autocomplete-header ion-no-padding column\">\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 <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>{{noResultMessage | translate}}</ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: inputControl.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 <!-- footer -->\n <ion-row *ngIf=\"itemCount as count\"\n 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 <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(matInputText.value | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n\n <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 <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n\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 mat-icon-button tabindex=\"-1\"\n type=\"button\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button 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",
7728
7889
  providers: [{
7729
7890
  provide: NG_VALUE_ACCESSOR,
7730
7891
  multi: true,
@@ -8041,7 +8202,7 @@ class ProgressBarService {
8041
8202
  }
8042
8203
  }
8043
8204
  }
8044
- ProgressBarService.ɵprov = ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8205
+ ProgressBarService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8045
8206
  ProgressBarService.decorators = [
8046
8207
  { type: Injectable, args: [{ providedIn: 'root' },] }
8047
8208
  ];
@@ -8085,7 +8246,7 @@ class AppGestureConfig extends HammerGestureConfig {
8085
8246
  return mc;
8086
8247
  }
8087
8248
  }
8088
- AppGestureConfig.ɵprov = ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8249
+ AppGestureConfig.ɵprov = i0.ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8089
8250
  AppGestureConfig.decorators = [
8090
8251
  { type: Injectable, args: [{ providedIn: 'root' },] }
8091
8252
  ];
@@ -8310,7 +8471,7 @@ class MatPaginatorI18n extends MatPaginatorIntl {
8310
8471
  this.previousPageLabel = this.translate.instant('COMMON.PAGINATOR.PREVIOUS_PAGE');
8311
8472
  }
8312
8473
  }
8313
- MatPaginatorI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(ɵɵinject(TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8474
+ MatPaginatorI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8314
8475
  MatPaginatorI18n.decorators = [
8315
8476
  { type: Injectable, args: [{ providedIn: 'root' },] }
8316
8477
  ];
@@ -8400,17 +8561,17 @@ function getColorContrast(color, bw) {
8400
8561
  return rgbArrayToHex(rgb.map(v => 255 - v));
8401
8562
  }
8402
8563
 
8403
- const noop$8 = () => {
8564
+ const noop = () => {
8404
8565
  };
8405
- const ɵ0$9 = noop$8;
8566
+ const ɵ0$3 = noop;
8406
8567
  class AppFormField {
8407
8568
  constructor(translate, cd, injector, formGroupDir) {
8408
8569
  this.translate = translate;
8409
8570
  this.cd = cd;
8410
8571
  this.injector = injector;
8411
8572
  this.formGroupDir = formGroupDir;
8412
- this._onChangeCallback = noop$8;
8413
- this._onTouchedCallback = noop$8;
8573
+ this._onChangeCallback = noop;
8574
+ this._onTouchedCallback = noop;
8414
8575
  this.readonly = false;
8415
8576
  this.compact = false;
8416
8577
  this.floatLabel = 'auto';
@@ -8846,14 +9007,14 @@ class AudioProvider extends StartableService {
8846
9007
  });
8847
9008
  }
8848
9009
  }
8849
- 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" });
9010
+ 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" });
8850
9011
  AudioProvider.decorators = [
8851
9012
  { type: Injectable, args: [{ providedIn: 'root' },] }
8852
9013
  ];
8853
9014
  AudioProvider.ctorParameters = () => [
8854
9015
  { type: Platform },
8855
- { type: NativeAudio$1, decorators: [{ type: Optional }] },
8856
- { type: Vibration$1, decorators: [{ type: Optional }] },
9016
+ { type: NativeAudio, decorators: [{ type: Optional }] },
9017
+ { type: Vibration, decorators: [{ type: Optional }] },
8857
9018
  { type: AudioManagement, decorators: [{ type: Optional }] }
8858
9019
  ];
8859
9020
 
@@ -8876,12 +9037,11 @@ HotkeysDialogComponent.ctorParameters = () => [
8876
9037
  ];
8877
9038
 
8878
9039
  class Hotkeys {
8879
- constructor(eventManager, dialog, document, modalController, popoverController) {
9040
+ constructor(eventManager, dialog, document, modalController) {
8880
9041
  this.eventManager = eventManager;
8881
9042
  this.dialog = dialog;
8882
9043
  this.document = document;
8883
9044
  this.modalController = modalController;
8884
- this.popoverController = popoverController;
8885
9045
  this._debug = false;
8886
9046
  this._hotkeys = new Map();
8887
9047
  this._defaults = {
@@ -8910,12 +9070,10 @@ class Hotkeys {
8910
9070
  return new Observable(observer => {
8911
9071
  const handler = (e) => __awaiter(this, void 0, void 0, function* () {
8912
9072
  // Get top component from ModalController
8913
- const top = (yield this.modalController.getTop()) || (yield this.popoverController.getTop());
9073
+ const top = yield this.modalController.getTop();
8914
9074
  // If modal present, check its component name against hotkey element name (fix #181)
8915
- if (top && top.component['name'] !== merged.elementName) {
8916
- e.preventDefault();
9075
+ if (top && top.component['name'] !== merged.elementName)
8917
9076
  return;
8918
- }
8919
9077
  if (e instanceof KeyboardEvent && e.repeat)
8920
9078
  return; // skip when repeated
8921
9079
  if (merged.preventDefault)
@@ -8938,7 +9096,7 @@ class Hotkeys {
8938
9096
  });
8939
9097
  }
8940
9098
  }
8941
- Hotkeys.ɵprov = ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(ɵɵinject(EventManager), ɵɵinject(MatDialog), ɵɵinject(DOCUMENT), ɵɵinject(ModalController), ɵɵinject(PopoverController)); }, token: Hotkeys, providedIn: "root" });
9099
+ Hotkeys.ɵprov = i0.ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(i0.ɵɵinject(i1$5.EventManager), i0.ɵɵinject(i2$1.MatDialog), i0.ɵɵinject(i1$3.DOCUMENT), i0.ɵɵinject(i1$4.ModalController)); }, token: Hotkeys, providedIn: "root" });
8942
9100
  Hotkeys.decorators = [
8943
9101
  { type: Injectable, args: [{
8944
9102
  providedIn: 'root'
@@ -8948,8 +9106,7 @@ Hotkeys.ctorParameters = () => [
8948
9106
  { type: EventManager },
8949
9107
  { type: MatDialog },
8950
9108
  { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
8951
- { type: ModalController },
8952
- { type: PopoverController }
9109
+ { type: ModalController }
8953
9110
  ];
8954
9111
 
8955
9112
  class SharedHotkeysModule {
@@ -9113,7 +9270,7 @@ class Base64ImageReader {
9113
9270
  }
9114
9271
  }
9115
9272
 
9116
- const uuidv4 = uuidv4Imported;
9273
+ const uuidv4$1 = uuidv4Imported;
9117
9274
  class FileService {
9118
9275
  constructor(platform,
9119
9276
  //private transfer: FileTransfer,
@@ -9150,7 +9307,7 @@ class FileService {
9150
9307
  const lastSlashIndex = source.lastIndexOf('/');
9151
9308
  if (lastSlashIndex === -1)
9152
9309
  throw new Error('Invalid URL: ' + source);
9153
- const fileName = lastSlashIndex < (source.length - 1) && source.substring(lastSlashIndex + 1) || uuidv4();
9310
+ const fileName = lastSlashIndex < (source.length - 1) && source.substring(lastSlashIndex + 1) || uuidv4$1();
9154
9311
  // Download into the file system
9155
9312
  if (responseType === 'file' && this.canUseFileSystem) {
9156
9313
  console.warn(`WARN: [file] Fetching image {${source}} in local file...`);
@@ -9206,7 +9363,7 @@ class FileService {
9206
9363
  this._started = true;
9207
9364
  }
9208
9365
  }
9209
- FileService.ɵprov = ɵɵdefineInjectable({ factory: function FileService_Factory() { return new FileService(ɵɵinject(Platform), ɵɵinject(HttpClient), ɵɵinject(ENVIRONMENT)); }, token: FileService, providedIn: "root" });
9366
+ 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" });
9210
9367
  FileService.decorators = [
9211
9368
  { type: Injectable, args: [{
9212
9369
  providedIn: 'root',
@@ -9372,7 +9529,7 @@ class Base58 {
9372
9529
  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
9373
9530
 
9374
9531
  const scrypt = require('scrypt-async');
9375
- const sha256 = require('hash.js/lib/hash/sha/256');
9532
+ const sha256$1 = require('hash.js/lib/hash/sha/256');
9376
9533
  const sha512 = require('hash.js/lib/hash/sha/512');
9377
9534
  const nacl = {
9378
9535
  sign,
@@ -9476,7 +9633,7 @@ class CryptoService {
9476
9633
  * Hash (using SHA256) a message
9477
9634
  */
9478
9635
  sha256(message) {
9479
- return sha256().update(message).digest('hex');
9636
+ return sha256$1().update(message).digest('hex');
9480
9637
  }
9481
9638
  /**
9482
9639
  * Hash (using SHA512) a message
@@ -9489,7 +9646,7 @@ class CryptoService {
9489
9646
  return nacl.util.encodeBase64(m);
9490
9647
  }
9491
9648
  }
9492
- CryptoService.ɵprov = ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
9649
+ CryptoService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
9493
9650
  CryptoService.decorators = [
9494
9651
  { type: Injectable, args: [{ providedIn: 'root' },] }
9495
9652
  ];
@@ -9972,109 +10129,6 @@ Peer = Peer_1 = __decorate([
9972
10129
  EntityClass({ typename: 'PeerVO' })
9973
10130
  ], Peer);
9974
10131
 
9975
- // import the required animation functions from the angular animations module
9976
- const fadeInAnimation =
9977
- // trigger name for attaching this animation to an element using the [@triggerName] syntax
9978
- trigger('fadeInAnimation', [
9979
- // route 'enter' transition
9980
- transition(':enter', [
9981
- // css styles at start of transition
9982
- style({ opacity: 0 }),
9983
- // animation and styles at end of transition
9984
- animate('.3s', style({ opacity: 1 }))
9985
- ]),
9986
- ]);
9987
- const fadeInOutAnimation =
9988
- // trigger name for attaching this animation to an element using the [@triggerName] syntax
9989
- trigger('fadeInOutAnimation', [
9990
- // route 'enter' transition
9991
- transition(':enter', [
9992
- // css styles at start of transition
9993
- style({ opacity: 0 }),
9994
- // animation and styles at end of transition
9995
- animate('.3s', style({ opacity: 1 }))
9996
- ]),
9997
- // route 'leave' transition
9998
- transition(':leave', [
9999
- // animation and styles at end of transition
10000
- animate('.5s ease-in-out', style({
10001
- opacity: 0
10002
- }))
10003
- ]),
10004
- ]);
10005
- const slideInOutAnimation =
10006
- // trigger name for attaching this animation to an element using the [@triggerName] syntax
10007
- trigger('slideInOutAnimation', [
10008
- // end state styles for route container (host)
10009
- state('*', style({
10010
- // the view covers the whole screen with a semi tranparent background
10011
- position: 'relative',
10012
- top: 0,
10013
- left: 0,
10014
- right: 0,
10015
- bottom: 0,
10016
- opacity: 1
10017
- })),
10018
- // route 'enter' transition
10019
- transition(':enter', [
10020
- // styles at start of transition
10021
- style({
10022
- // start with the content positioned off the right of the screen,
10023
- // -400% is required instead of -100% because the negative position adds to the width of the element
10024
- left: '400%',
10025
- // start with background opacity set to 0 (invisible)
10026
- opacity: 0
10027
- }),
10028
- // animation and styles at end of transition
10029
- animate('.3s ease-in-out', style({
10030
- // transition the right position to 0 which slides the content into view
10031
- left: 0,
10032
- // transition the background opacity to 0.8 to fade it in
10033
- opacity: 0.8
10034
- }))
10035
- ]),
10036
- // route 'leave' transition
10037
- transition(':leave', [
10038
- // animation and styles at end of transition
10039
- animate('.5s ease-in-out', style({
10040
- // transition the right position to -400% which slides the content out of view
10041
- left: '400%',
10042
- // transition the background opacity to 0 to fade it out
10043
- opacity: 0
10044
- }))
10045
- ])
10046
- ]);
10047
- const slideUpDownAnimation =
10048
- // trigger name for attaching this animation to an element using the [@triggerName] syntax
10049
- trigger('slideUpDownAnimation', [
10050
- // end state styles for route container (host)
10051
- state('*', style({
10052
- transform: 'translateY(0)',
10053
- opacity: 1
10054
- })),
10055
- // route 'enter' transition
10056
- transition(':enter', [
10057
- // styles at start of transition
10058
- style({
10059
- transform: 'translateY(-400%)',
10060
- opacity: 0
10061
- }),
10062
- // animation and styles at end of transition
10063
- animate('.3s ease-in-out', style({
10064
- transform: 'translateY(0)',
10065
- opacity: 1
10066
- }))
10067
- ]),
10068
- // route 'leave' transition
10069
- transition(':leave', [
10070
- // animation and styles at end of transition
10071
- animate('.5s ease-in-out', style({
10072
- transform: 'translateY(-100%)',
10073
- opacity: 0
10074
- }))
10075
- ])
10076
- ]);
10077
-
10078
10132
  class HttpUtils {
10079
10133
  static getText(http, uri, opts) {
10080
10134
  return __awaiter(this, void 0, void 0, function* () {
@@ -10352,7 +10406,7 @@ SelectPeerModal.propDecorators = {
10352
10406
  onRefresh: [{ type: Input }]
10353
10407
  };
10354
10408
 
10355
- const moment$3 = momentImported;
10409
+ const moment$4 = momentImported;
10356
10410
  const SETTINGS_STORAGE_KEY = 'settings';
10357
10411
  const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
10358
10412
  // fixme: this constant points to static environment
@@ -10595,11 +10649,11 @@ class LocalSettingsService extends StartableService {
10595
10649
  if (!feature) {
10596
10650
  feature = {
10597
10651
  name: featureName.toLowerCase(),
10598
- lastSyncDate: moment$3().toISOString()
10652
+ lastSyncDate: moment$4().toISOString()
10599
10653
  };
10600
10654
  }
10601
10655
  else {
10602
- feature.lastSyncDate = moment$3().toISOString();
10656
+ feature.lastSyncDate = moment$4().toISOString();
10603
10657
  }
10604
10658
  this.saveOfflineFeature(feature);
10605
10659
  }
@@ -10760,7 +10814,7 @@ class LocalSettingsService extends StartableService {
10760
10814
  if (!page || !page.title || !page.path)
10761
10815
  throw Error('Missing required argument \'page\', \'page.path\' or \'page.title\'');
10762
10816
  // Set time
10763
- page.time = page.time || moment$3();
10817
+ page.time = page.time || moment$4();
10764
10818
  // Clean the title (remove <small> tags)
10765
10819
  if (!opts || opts.removeTitleSmallTag !== false) {
10766
10820
  const tagIndex = page.title.indexOf('</small>');
@@ -10776,7 +10830,7 @@ class LocalSettingsService extends StartableService {
10776
10830
  return page;
10777
10831
  }
10778
10832
  }
10779
- 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" });
10833
+ 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" });
10780
10834
  LocalSettingsService.decorators = [
10781
10835
  { type: Injectable, args: [{
10782
10836
  providedIn: 'root',
@@ -11493,7 +11547,7 @@ class NetworkService extends StartableService {
11493
11547
  });
11494
11548
  }
11495
11549
  }
11496
- 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" });
11550
+ 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" });
11497
11551
  NetworkService.decorators = [
11498
11552
  { type: Injectable, args: [{ providedIn: 'root' },] }
11499
11553
  ];
@@ -11504,16 +11558,16 @@ NetworkService.ctorParameters = () => [
11504
11558
  { type: CryptoService },
11505
11559
  { type: Storage },
11506
11560
  { type: LocalSettingsService },
11507
- { type: CacheService$1 },
11561
+ { type: CacheService },
11508
11562
  { type: HttpClient },
11509
11563
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
11510
- { type: Network$1, decorators: [{ type: Optional }] },
11511
- { type: SplashScreen$1, decorators: [{ type: Optional }] },
11564
+ { type: Network, decorators: [{ type: Optional }] },
11565
+ { type: SplashScreen, decorators: [{ type: Optional }] },
11512
11566
  { type: TranslateService, decorators: [{ type: Optional }] },
11513
11567
  { type: ToastController, decorators: [{ type: Optional }] }
11514
11568
  ];
11515
11569
 
11516
- const ErrorCodes = {
11570
+ const ErrorCodes$2 = {
11517
11571
  UNKNOWN_ERROR: 0,
11518
11572
  LOAD_ACCOUNT_ERROR: 1,
11519
11573
  BAD_PASSWORD: 2,
@@ -11865,7 +11919,7 @@ class EntityStore {
11865
11919
  }
11866
11920
  catch (err) {
11867
11921
  console.error(err);
11868
- throw { code: ErrorCodes.ENTITY_STORAGE_MIGRATION_FAILED, message: 'ERROR.ENTITY_STORAGE_MIGRATION_FAILED', details: err };
11922
+ throw { code: ErrorCodes$2.ENTITY_STORAGE_MIGRATION_FAILED, message: 'ERROR.ENTITY_STORAGE_MIGRATION_FAILED', details: err };
11869
11923
  }
11870
11924
  }
11871
11925
  // Emit update event
@@ -12439,7 +12493,7 @@ class EntitiesStorage extends StartableService {
12439
12493
  }
12440
12494
  EntitiesStorage.TRASH_PREFIX = 'Trash#';
12441
12495
  EntitiesStorage.REMOTE_PREFIX = 'Remote#';
12442
- 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" });
12496
+ 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" });
12443
12497
  EntitiesStorage.decorators = [
12444
12498
  { type: Injectable, args: [{ providedIn: 'root' },] }
12445
12499
  ];
@@ -12576,10 +12630,10 @@ function referentialToString(obj, properties) {
12576
12630
  function referentialsToString(values, properties, separator) {
12577
12631
  return (values || []).map(v => referentialToString(v, properties)).join(separator || ', ');
12578
12632
  }
12579
- const ɵ0$a = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12633
+ const ɵ0$2 = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12580
12634
  const StatusList = Object.freeze([
12581
12635
  {
12582
- id: ɵ0$a,
12636
+ id: ɵ0$2,
12583
12637
  icon: 'checkmark',
12584
12638
  label: 'REFERENTIAL.STATUS_ENUM.ENABLE'
12585
12639
  },
@@ -12854,7 +12908,7 @@ function accountToString(data) {
12854
12908
  (data.lastName || '')) || '';
12855
12909
  }
12856
12910
 
12857
- const uuidv4$1 = uuidv4Imported;
12911
+ const uuidv4 = uuidv4Imported;
12858
12912
  const _global = typeof global !== 'undefined' ? global : (typeof window !== 'undefined' ? window : {});
12859
12913
  const NativeWebSocket = _global.WebSocket || _global.MozWebSocket;
12860
12914
  /**
@@ -12898,7 +12952,7 @@ function createTrackerLink(opts) {
12898
12952
  // Skip if not tracked
12899
12953
  if (!context || !context.tracked)
12900
12954
  return forward(operation);
12901
- const id = context.serializationKey || uuidv4$1();
12955
+ const id = context.serializationKey || uuidv4();
12902
12956
  console.debug(`[apollo-tracker-link] Watching tracked query {${operation.operationName}#${id}}`);
12903
12957
  // Clean context, before calling JSON.stringify (remove unused attributes)
12904
12958
  const cleanContext = Object.assign(Object.assign({}, context), { optimisticResponse: null, cache: null });
@@ -13561,7 +13615,7 @@ class GraphqlService extends StartableService {
13561
13615
  (err.networkError && ((err.networkError.error && this.toAppError(err.networkError.error))
13562
13616
  || this.toAppError(err.networkError)
13563
13617
  || (err.networkError.error && this.createAppErrorByCode(err.networkError.error.status))
13564
- || this.createAppErrorByCode(ErrorCodes.UNKNOWN_NETWORK_ERROR)))
13618
+ || this.createAppErrorByCode(ErrorCodes$2.UNKNOWN_NETWORK_ERROR)))
13565
13619
  // If graphQL: try to convert the first error found
13566
13620
  || (err.graphQLErrors && err.graphQLErrors.length && this.toAppError(err.graphQLErrors[0]))
13567
13621
  || this.toAppError(err)
@@ -13569,7 +13623,7 @@ class GraphqlService extends StartableService {
13569
13623
  || (err.graphQLErrors && err.graphQLErrors[0])
13570
13624
  || err;
13571
13625
  console.error('[graphql] ' + (error && error.message || error), error.stack || '');
13572
- if (error && error.code === ErrorCodes.UNKNOWN_NETWORK_ERROR && err.networkError && err.networkError.message) {
13626
+ if (error && error.code === ErrorCodes$2.UNKNOWN_NETWORK_ERROR && err.networkError && err.networkError.message) {
13573
13627
  console.error('[graphql] original error: ' + err.networkError.message);
13574
13628
  this.onNetworkError.next(error);
13575
13629
  }
@@ -13605,7 +13659,7 @@ class GraphqlService extends StartableService {
13605
13659
  return 'ERROR.UNAUTHORIZED';
13606
13660
  case ServerErrorCodes.FORBIDDEN:
13607
13661
  return 'ERROR.FORBIDDEN';
13608
- case ErrorCodes.UNKNOWN_NETWORK_ERROR:
13662
+ case ErrorCodes$2.UNKNOWN_NETWORK_ERROR:
13609
13663
  return 'ERROR.UNKNOWN_NETWORK_ERROR';
13610
13664
  case ServerErrorCodes.BAD_UPDATE_DATE:
13611
13665
  return 'ERROR.BAD_UPDATE_DATE';
@@ -13636,7 +13690,7 @@ class GraphqlService extends StartableService {
13636
13690
  return undefined;
13637
13691
  }
13638
13692
  }
13639
- 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" });
13693
+ 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" });
13640
13694
  GraphqlService.decorators = [
13641
13695
  { type: Injectable, args: [{
13642
13696
  providedIn: 'root'
@@ -13653,7 +13707,7 @@ GraphqlService.ctorParameters = () => [
13653
13707
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_GRAPHQL_TYPE_POLICIES,] }] }
13654
13708
  ];
13655
13709
 
13656
- const sha256$1 = require('hash.js/lib/hash/sha/256');
13710
+ const sha256 = require('hash.js/lib/hash/sha/256');
13657
13711
  class BaseGraphqlServiceOptions {
13658
13712
  }
13659
13713
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
@@ -13804,8 +13858,8 @@ class BaseGraphqlService extends StartableService {
13804
13858
  }
13805
13859
  /* -- protected methods -- */
13806
13860
  computeMutableWatchQueryId(opts) {
13807
- const queryName = opts.queryName || sha256$1().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
13808
- const variablesKey = opts.variables && sha256$1().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
13861
+ const queryName = opts.queryName || sha256().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
13862
+ const variablesKey = opts.variables && sha256().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
13809
13863
  return [queryName, opts.arrayFieldName, variablesKey].join('|');
13810
13864
  }
13811
13865
  findMutableWatchQueries(opts) {
@@ -13875,7 +13929,7 @@ const DEFAULT_AVATAR_IMAGE = 'assets/img/person.png';
13875
13929
  /* ------------------------------------
13876
13930
  * GraphQL queries
13877
13931
  * ------------------------------------*/
13878
- const Fragments = {
13932
+ const Fragments$1 = {
13879
13933
  account: gql `
13880
13934
  fragment AccountFragment on AccountVO {
13881
13935
  id
@@ -13910,14 +13964,14 @@ const Fragments = {
13910
13964
  }`
13911
13965
  };
13912
13966
  // Load account query
13913
- const LoadQuery = gql `
13967
+ const LoadQuery$1 = gql `
13914
13968
  query Account {
13915
13969
  data: account {
13916
13970
  ...AccountFragment
13917
13971
  }
13918
13972
  }
13919
- ${Fragments.account}
13920
- ${Fragments.settings}
13973
+ ${Fragments$1.account}
13974
+ ${Fragments$1.settings}
13921
13975
  `;
13922
13976
  // Check email query
13923
13977
  const IsEmailExistsQuery = gql `
@@ -13932,21 +13986,21 @@ const AccountMutations = {
13932
13986
  ...AccountFragment
13933
13987
  }
13934
13988
  }
13935
- ${Fragments.account}
13936
- ${Fragments.settings}`,
13989
+ ${Fragments$1.account}
13990
+ ${Fragments$1.settings}`,
13937
13991
  create: gql `mutation CreateAccount($data:AccountVOInput){
13938
13992
  data: createAccount(account: $data){
13939
13993
  ...AccountFragment
13940
13994
  }
13941
13995
  }
13942
- ${Fragments.account}
13943
- ${Fragments.settings}`,
13996
+ ${Fragments$1.account}
13997
+ ${Fragments$1.settings}`,
13944
13998
  saveSettings: gql `mutation SaveSettings($data:UserSettingsVOInput){
13945
13999
  data: saveSettings(settings: $data){
13946
14000
  ...UserSettingsFragment
13947
14001
  }
13948
14002
  }
13949
- ${Fragments.settings}`
14003
+ ${Fragments$1.settings}`
13950
14004
  };
13951
14005
  // Sent confirmation email
13952
14006
  const SendConfirmEmailMutation = gql `
@@ -14261,7 +14315,7 @@ class AccountService extends BaseGraphqlService {
14261
14315
  catch (error) {
14262
14316
  console.error(error);
14263
14317
  this.resetData();
14264
- throw { code: ErrorCodes.UNKNOWN_ERROR, message: 'ERROR.SCRYPT_ERROR' };
14318
+ throw { code: ErrorCodes$2.UNKNOWN_ERROR, message: 'ERROR.SCRYPT_ERROR' };
14265
14319
  }
14266
14320
  // Store pubkey+keypair
14267
14321
  this._cache.pubkey = Base58.encode(keypair.publicKey);
@@ -14295,7 +14349,7 @@ class AccountService extends BaseGraphqlService {
14295
14349
  }
14296
14350
  catch (err) {
14297
14351
  // If account not found, check if email is valid
14298
- if (err && +(err.code) === ErrorCodes.LOAD_ACCOUNT_ERROR) {
14352
+ if (err && +(err.code) === ErrorCodes$2.LOAD_ACCOUNT_ERROR) {
14299
14353
  // Check email exists
14300
14354
  if (data.username.indexOf('@') !== -1) {
14301
14355
  let isEmailExists;
@@ -14307,11 +14361,11 @@ class AccountService extends BaseGraphqlService {
14307
14361
  }
14308
14362
  // Email not exists (no account)
14309
14363
  if (!isEmailExists) {
14310
- throw { code: ErrorCodes.UNKNOWN_ACCOUNT_EMAIL, message: 'ERROR.UNKNOWN_ACCOUNT_EMAIL' };
14364
+ throw { code: ErrorCodes$2.UNKNOWN_ACCOUNT_EMAIL, message: 'ERROR.UNKNOWN_ACCOUNT_EMAIL' };
14311
14365
  }
14312
14366
  }
14313
14367
  // Email exists, so error = 'bad password'
14314
- throw { code: ErrorCodes.BAD_PASSWORD, message: 'ERROR.BAD_PASSWORD' };
14368
+ throw { code: ErrorCodes$2.BAD_PASSWORD, message: 'ERROR.BAD_PASSWORD' };
14315
14369
  }
14316
14370
  throw err; // resend the first error
14317
14371
  }
@@ -14457,8 +14511,8 @@ class AccountService extends BaseGraphqlService {
14457
14511
  // Load remotely
14458
14512
  else {
14459
14513
  const { data } = yield this.graphql.query({
14460
- query: LoadQuery,
14461
- error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
14514
+ query: LoadQuery$1,
14515
+ error: { code: ErrorCodes$2.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
14462
14516
  fetchPolicy: opts && opts.fetchPolicy || 'no-cache' || undefined
14463
14517
  });
14464
14518
  json = data;
@@ -14485,7 +14539,7 @@ class AccountService extends BaseGraphqlService {
14485
14539
  return __awaiter(this, void 0, void 0, function* () {
14486
14540
  const isEmailExists = yield this.isEmailExists(email);
14487
14541
  if (isEmailExists) {
14488
- throw { code: ErrorCodes.EMAIL_ALREADY_REGISTERED, message: 'ERROR.EMAIL_ALREADY_REGISTERED' };
14542
+ throw { code: ErrorCodes$2.EMAIL_ALREADY_REGISTERED, message: 'ERROR.EMAIL_ALREADY_REGISTERED' };
14489
14543
  }
14490
14544
  });
14491
14545
  }
@@ -14521,7 +14575,7 @@ class AccountService extends BaseGraphqlService {
14521
14575
  locale
14522
14576
  },
14523
14577
  error: {
14524
- code: ErrorCodes.SENT_CONFIRMATION_EMAIL_FAILED,
14578
+ code: ErrorCodes$2.SENT_CONFIRMATION_EMAIL_FAILED,
14525
14579
  message: 'ERROR.SENT_ACCOUNT_CONFIRMATION_EMAIL_FAILED'
14526
14580
  }
14527
14581
  });
@@ -14537,7 +14591,7 @@ class AccountService extends BaseGraphqlService {
14537
14591
  code
14538
14592
  },
14539
14593
  error: {
14540
- code: ErrorCodes.CONFIRM_EMAIL_FAILED,
14594
+ code: ErrorCodes$2.CONFIRM_EMAIL_FAILED,
14541
14595
  message: 'ERROR.CONFIRM_ACCOUNT_EMAIL_FAILED'
14542
14596
  }
14543
14597
  });
@@ -14616,7 +14670,7 @@ class AccountService extends BaseGraphqlService {
14616
14670
  throw error;
14617
14671
  console.error(error);
14618
14672
  throw {
14619
- code: ErrorCodes.LOAD_ACCOUNT_ERROR,
14673
+ code: ErrorCodes$2.LOAD_ACCOUNT_ERROR,
14620
14674
  message: 'ERROR.LOAD_ACCOUNT_ERROR'
14621
14675
  };
14622
14676
  }
@@ -14786,7 +14840,7 @@ class AccountService extends BaseGraphqlService {
14786
14840
  if (!isNew) {
14787
14841
  const existingAccount = yield this.load({ fetchPolicy: 'network-only' });
14788
14842
  if (!existingAccount || !existingAccount.updateDate) {
14789
- throw { code: ErrorCodes.ACCOUNT_NOT_EXISTS, message: 'ERROR.ACCOUNT_NOT_EXISTS' };
14843
+ throw { code: ErrorCodes$2.ACCOUNT_NOT_EXISTS, message: 'ERROR.ACCOUNT_NOT_EXISTS' };
14790
14844
  }
14791
14845
  this.copyIdAndUpdateDate(existingAccount, account);
14792
14846
  }
@@ -14798,7 +14852,7 @@ class AccountService extends BaseGraphqlService {
14798
14852
  mutation: isNew ? AccountMutations.create : AccountMutations.save,
14799
14853
  variables: { data: json },
14800
14854
  error: {
14801
- code: ErrorCodes.SAVE_ACCOUNT_ERROR,
14855
+ code: ErrorCodes$2.SAVE_ACCOUNT_ERROR,
14802
14856
  message: 'ERROR.SAVE_ACCOUNT_ERROR'
14803
14857
  }
14804
14858
  });
@@ -14825,7 +14879,7 @@ class AccountService extends BaseGraphqlService {
14825
14879
  mutation: AccountMutations.saveSettings,
14826
14880
  variables: { data: json },
14827
14881
  error: {
14828
- code: ErrorCodes.SAVE_SETTINGS_ERROR,
14882
+ code: ErrorCodes$2.SAVE_SETTINGS_ERROR,
14829
14883
  message: 'ERROR.SAVE_SETTINGS_ERROR'
14830
14884
  }
14831
14885
  });
@@ -14847,7 +14901,7 @@ class AccountService extends BaseGraphqlService {
14847
14901
  if (counter > 4) {
14848
14902
  if (this._debug)
14849
14903
  console.debug(`[account] Failed to authentication on pod (after ${counter} attempts)`);
14850
- throw { code: ErrorCodes.AUTH_SERVER_ERROR, message: 'ERROR.AUTH_SERVER_ERROR' };
14904
+ throw { code: ErrorCodes$2.AUTH_SERVER_ERROR, message: 'ERROR.AUTH_SERVER_ERROR' };
14851
14905
  }
14852
14906
  // Check if valid
14853
14907
  if (token) {
@@ -14857,7 +14911,7 @@ class AccountService extends BaseGraphqlService {
14857
14911
  token
14858
14912
  },
14859
14913
  error: {
14860
- code: ErrorCodes.UNAUTHORIZED,
14914
+ code: ErrorCodes$2.UNAUTHORIZED,
14861
14915
  message: 'ERROR.UNAUTHORIZED'
14862
14916
  },
14863
14917
  fetchPolicy: 'no-cache'
@@ -14873,7 +14927,7 @@ class AccountService extends BaseGraphqlService {
14873
14927
  }
14874
14928
  // Generate a new token
14875
14929
  const challengeError = {
14876
- code: ErrorCodes.AUTH_CHALLENGE_ERROR,
14930
+ code: ErrorCodes$2.AUTH_CHALLENGE_ERROR,
14877
14931
  message: 'ERROR.AUTH_CHALLENGE_ERROR'
14878
14932
  };
14879
14933
  const data = yield this.graphql.query({
@@ -14951,7 +15005,7 @@ class AccountService extends BaseGraphqlService {
14951
15005
  query: AccountSubscriptions.listenChanges,
14952
15006
  variables,
14953
15007
  error: {
14954
- code: ErrorCodes.SUBSCRIBE_ACCOUNT_ERROR,
15008
+ code: ErrorCodes$2.SUBSCRIBE_ACCOUNT_ERROR,
14955
15009
  message: 'ERROR.ACCOUNT.SUBSCRIBE_ERROR'
14956
15010
  }
14957
15011
  }).pipe(map(({ data }) => data),
@@ -14980,7 +15034,7 @@ class AccountService extends BaseGraphqlService {
14980
15034
  return Toasts.show(this.toastController, this.translate, opts);
14981
15035
  }
14982
15036
  }
14983
- 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" });
15037
+ 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" });
14984
15038
  AccountService.decorators = [
14985
15039
  { type: Injectable, args: [{ providedIn: 'root', deps: [ENVIRONMENT] },] }
14986
15040
  ];
@@ -15248,7 +15302,7 @@ const CONFIGURATION_STORAGE_KEY = 'configuration';
15248
15302
  /* ------------------------------------
15249
15303
  * GraphQL queries
15250
15304
  * ------------------------------------*/
15251
- const Fragments$1 = {
15305
+ const Fragments = {
15252
15306
  config: gql `
15253
15307
  fragment ConfigFragment on ConfigurationVO {
15254
15308
  id
@@ -15275,13 +15329,13 @@ const Fragments$1 = {
15275
15329
  }
15276
15330
  `
15277
15331
  };
15278
- const LoadQuery$1 = gql `
15332
+ const LoadQuery = gql `
15279
15333
  query Configuration{
15280
15334
  data: configuration{
15281
15335
  ...ConfigFragment
15282
15336
  }
15283
15337
  }
15284
- ${Fragments$1.config}
15338
+ ${Fragments.config}
15285
15339
  `;
15286
15340
  // Save (create or update) account mutation
15287
15341
  const SaveMutation = gql `
@@ -15290,7 +15344,7 @@ const SaveMutation = gql `
15290
15344
  ...ConfigFragment
15291
15345
  }
15292
15346
  }
15293
- ${Fragments$1.config}
15347
+ ${Fragments.config}
15294
15348
  `;
15295
15349
  const ClearCache = gql `
15296
15350
  query ClearCache($name: String) {
@@ -15341,12 +15395,12 @@ class ConfigService extends BaseGraphqlService {
15341
15395
  return __awaiter(this, void 0, void 0, function* () {
15342
15396
  const now = Date.now();
15343
15397
  console.debug('[config] Loading Pod configuration...');
15344
- const query = opts && opts.query || LoadQuery$1;
15398
+ const query = opts && opts.query || LoadQuery;
15345
15399
  const variables = opts && opts.variables || undefined;
15346
15400
  const res = yield this.graphql.query({
15347
15401
  query,
15348
15402
  variables,
15349
- error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15403
+ error: { code: ErrorCodes$2.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15350
15404
  fetchPolicy: opts && opts.fetchPolicy || undefined /*default*/
15351
15405
  });
15352
15406
  const data = res && res.data ? Configuration.fromObject(res.data) : undefined;
@@ -15379,7 +15433,7 @@ class ConfigService extends BaseGraphqlService {
15379
15433
  data: json
15380
15434
  },
15381
15435
  error: {
15382
- code: ErrorCodes.SAVE_CONFIG_ERROR,
15436
+ code: ErrorCodes$2.SAVE_CONFIG_ERROR,
15383
15437
  message: 'ERROR.SAVE_CONFIG_ERROR'
15384
15438
  }
15385
15439
  });
@@ -15405,7 +15459,7 @@ class ConfigService extends BaseGraphqlService {
15405
15459
  const res = yield this.graphql.query({
15406
15460
  query: CacheStatistics,
15407
15461
  variables: null,
15408
- error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15462
+ error: { code: ErrorCodes$2.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15409
15463
  fetchPolicy: 'network-only'
15410
15464
  });
15411
15465
  const data = res && res.cacheStatistics || undefined;
@@ -15421,7 +15475,7 @@ class ConfigService extends BaseGraphqlService {
15421
15475
  const res = yield this.graphql.query({
15422
15476
  query: ClearCache,
15423
15477
  variables,
15424
- error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15478
+ error: { code: ErrorCodes$2.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15425
15479
  fetchPolicy: 'no-cache'
15426
15480
  });
15427
15481
  const data = res && res.clearCache || undefined;
@@ -15580,7 +15634,7 @@ class ConfigService extends BaseGraphqlService {
15580
15634
  });
15581
15635
  }
15582
15636
  }
15583
- 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" });
15637
+ 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" });
15584
15638
  ConfigService.decorators = [
15585
15639
  { type: Injectable, args: [{
15586
15640
  providedIn: 'root',
@@ -15600,7 +15654,7 @@ ConfigService.ctorParameters = () => [
15600
15654
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_CONFIG_OPTIONS,] }] }
15601
15655
  ];
15602
15656
 
15603
- const moment$4 = momentImported;
15657
+ const moment$3 = momentImported;
15604
15658
  const AndroidOsEnvironment = Object.freeze({
15605
15659
  DIRECTORY_DOWNLOADS: 'Download',
15606
15660
  DIRECTORY_DOWNLOADS_OLD: 'Downloads',
@@ -15834,16 +15888,16 @@ class PlatformService extends StartableService {
15834
15888
  }
15835
15889
  // config moment lib
15836
15890
  try {
15837
- moment$4.locale(event.lang);
15891
+ moment$3.locale(event.lang);
15838
15892
  console.debug('[platform] Use locale {' + event.lang + '}');
15839
15893
  }
15840
15894
  // If error, fallback to en
15841
15895
  catch (err) {
15842
- moment$4.locale('en');
15896
+ moment$3.locale('en');
15843
15897
  console.warn('[platform] Unknown local for moment lib. Using default [en]');
15844
15898
  }
15845
15899
  // Config date adapter
15846
- this.dateAdapter.setLocale(moment$4.locale());
15900
+ this.dateAdapter.setLocale(moment$3.locale());
15847
15901
  }
15848
15902
  });
15849
15903
  this.settings.onChange.subscribe(data => {
@@ -16044,7 +16098,7 @@ class PlatformService extends StartableService {
16044
16098
  });
16045
16099
  }
16046
16100
  }
16047
- 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" });
16101
+ 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" });
16048
16102
  PlatformService.decorators = [
16049
16103
  { type: Injectable, args: [{ providedIn: 'root' },] }
16050
16104
  ];
@@ -16059,15 +16113,15 @@ PlatformService.ctorParameters = () => [
16059
16113
  { type: NetworkService },
16060
16114
  { type: AccountService },
16061
16115
  { type: ConfigService },
16062
- { type: CacheService$1 },
16116
+ { type: CacheService },
16063
16117
  { type: Storage },
16064
16118
  { type: AudioProvider },
16065
16119
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
16066
- { type: StatusBar$1, decorators: [{ type: Optional }] },
16120
+ { type: StatusBar, decorators: [{ type: Optional }] },
16067
16121
  { type: Keyboard, decorators: [{ type: Optional }] },
16068
- { type: SplashScreen$1, decorators: [{ type: Optional }] },
16069
- { type: InAppBrowser$1, decorators: [{ type: Optional }] },
16070
- { type: Downloader$1, decorators: [{ type: Optional }] }
16122
+ { type: SplashScreen, decorators: [{ type: Optional }] },
16123
+ { type: InAppBrowser, decorators: [{ type: Optional }] },
16124
+ { type: Downloader, decorators: [{ type: Optional }] }
16071
16125
  ];
16072
16126
 
16073
16127
  class AppHelpModal {
@@ -16131,7 +16185,7 @@ class MatStepperI18n extends MatStepperIntl {
16131
16185
  this.optionalLabel = this.translate.instant('COMMON.OPTIONAL');
16132
16186
  }
16133
16187
  }
16134
- MatStepperI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(ɵɵinject(TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16188
+ MatStepperI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16135
16189
  MatStepperI18n.decorators = [
16136
16190
  { type: Injectable, args: [{ providedIn: 'root' },] }
16137
16191
  ];
@@ -17967,7 +18021,7 @@ function state2side(state) {
17967
18021
  return 1;
17968
18022
  }
17969
18023
  }
17970
- const ɵ0$b = (defaultStateSize) => [
18024
+ const ɵ0$1 = (defaultStateSize) => [
17971
18025
  Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
17972
18026
  Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
17973
18027
  Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
@@ -17975,7 +18029,7 @@ const ɵ0$b = (defaultStateSize) => [
17975
18029
  const SCALE_OPTIONS_DEFAULT = {
17976
18030
  startColor: rgbArrayMap.red,
17977
18031
  startStates: [0, 2, 3],
17978
- startStepsFn: ɵ0$b
18032
+ startStepsFn: ɵ0$1
17979
18033
  };
17980
18034
  /**
17981
18035
  * Internal function, that create a colors scale, using iteration
@@ -18772,7 +18826,7 @@ class UserSettingsValidatorService extends AppValidatorService {
18772
18826
  });
18773
18827
  }
18774
18828
  }
18775
- UserSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(ɵɵinject(FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
18829
+ UserSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
18776
18830
  UserSettingsValidatorService.decorators = [
18777
18831
  { type: Injectable, args: [{ providedIn: 'root' },] }
18778
18832
  ];
@@ -18816,7 +18870,7 @@ class AccountValidatorService extends AppValidatorService {
18816
18870
  return validatorFns.length ? Validators.compose(validatorFns) : validatorFns.length === 1 ? validatorFns[0] : undefined;
18817
18871
  }
18818
18872
  }
18819
- AccountValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
18873
+ AccountValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
18820
18874
  AccountValidatorService.decorators = [
18821
18875
  { type: Injectable, args: [{ providedIn: 'root' },] }
18822
18876
  ];
@@ -19381,7 +19435,7 @@ class LocalSettingsValidatorService extends AppValidatorService {
19381
19435
  });
19382
19436
  }
19383
19437
  }
19384
- LocalSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(ɵɵinject(FormBuilder), ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
19438
+ LocalSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
19385
19439
  LocalSettingsValidatorService.decorators = [
19386
19440
  { type: Injectable, args: [{ providedIn: 'root' },] }
19387
19441
  ];
@@ -20000,7 +20054,7 @@ class IsOnFieldModePipe {
20000
20054
  return value === 'FIELD';
20001
20055
  }
20002
20056
  }
20003
- IsOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20057
+ IsOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20004
20058
  IsOnFieldModePipe.decorators = [
20005
20059
  { type: Pipe, args: [{
20006
20060
  name: 'isOnField'
@@ -20012,7 +20066,7 @@ class IsNotOnFieldModePipe {
20012
20066
  return value !== 'FIELD';
20013
20067
  }
20014
20068
  }
20015
- IsNotOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20069
+ IsNotOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20016
20070
  IsNotOnFieldModePipe.decorators = [
20017
20071
  { type: Pipe, args: [{
20018
20072
  name: 'isNotOnField'
@@ -20027,7 +20081,7 @@ class PersonToStringPipe {
20027
20081
  return PersonUtils.personToString(value);
20028
20082
  }
20029
20083
  }
20030
- PersonToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20084
+ PersonToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20031
20085
  PersonToStringPipe.decorators = [
20032
20086
  { type: Pipe, args: [{
20033
20087
  name: 'personToString'
@@ -20412,7 +20466,7 @@ class IsLoginAccountPipe {
20412
20466
  return value && value.pubkey && true;
20413
20467
  }
20414
20468
  }
20415
- IsLoginAccountPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
20469
+ IsLoginAccountPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
20416
20470
  IsLoginAccountPipe.decorators = [
20417
20471
  { type: Pipe, args: [{
20418
20472
  name: 'isLogin'
@@ -20424,7 +20478,7 @@ class AccountToStringPipe {
20424
20478
  return accountToString(value);
20425
20479
  }
20426
20480
  }
20427
- AccountToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
20481
+ AccountToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
20428
20482
  AccountToStringPipe.decorators = [
20429
20483
  { type: Pipe, args: [{
20430
20484
  name: 'accountToString'
@@ -20439,7 +20493,7 @@ class DepartmentToStringPipe {
20439
20493
  return departmentToString(value);
20440
20494
  }
20441
20495
  }
20442
- DepartmentToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
20496
+ DepartmentToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
20443
20497
  DepartmentToStringPipe.decorators = [
20444
20498
  { type: Pipe, args: [{
20445
20499
  name: 'departmentToString'
@@ -20535,7 +20589,7 @@ class MenuService {
20535
20589
  this._visibleSubject.next(value);
20536
20590
  }
20537
20591
  }
20538
- MenuService.ɵprov = ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
20592
+ MenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
20539
20593
  MenuService.decorators = [
20540
20594
  { type: Injectable, args: [{
20541
20595
  providedIn: 'root'
@@ -20991,7 +21045,7 @@ class AuthGuardService {
20991
21045
  }));
20992
21046
  }
20993
21047
  }
20994
- AuthGuardService.ɵprov = ɵɵdefineInjectable({ factory: function AuthGuardService_Factory() { return new AuthGuardService(ɵɵinject(AccountService), ɵɵinject(ModalController), ɵɵinject(Router), ɵɵinject(ENVIRONMENT)); }, token: AuthGuardService, providedIn: "root" });
21048
+ 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" });
20995
21049
  AuthGuardService.decorators = [
20996
21050
  { type: Injectable, args: [{ providedIn: 'root' },] }
20997
21051
  ];
@@ -21033,7 +21087,7 @@ class BaseEntityService extends BaseGraphqlService {
21033
21087
  query,
21034
21088
  variables: { id },
21035
21089
  fetchPolicy: opts && opts.fetchPolicy || undefined,
21036
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
21090
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
21037
21091
  })
21038
21092
  .pipe(map(({ data }) => (!opts || opts.toEntity !== false)
21039
21093
  ? (data && this.fromObject(data))
@@ -21048,7 +21102,7 @@ class BaseEntityService extends BaseGraphqlService {
21048
21102
  query,
21049
21103
  variables: { id },
21050
21104
  fetchPolicy: opts && opts.fetchPolicy || undefined,
21051
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
21105
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
21052
21106
  });
21053
21107
  // Convert to entity
21054
21108
  return (!opts || opts.toEntity !== false)
@@ -21079,7 +21133,7 @@ class BaseEntityService extends BaseGraphqlService {
21079
21133
  totalFieldName: withTotal ? 'total' : undefined,
21080
21134
  insertFilterFn: filter && filter.asFilterFn(),
21081
21135
  variables,
21082
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' },
21136
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' },
21083
21137
  fetchPolicy: opts && opts.fetchPolicy || undefined
21084
21138
  })
21085
21139
  .pipe(map(({ data, total }) => {
@@ -21115,7 +21169,7 @@ class BaseEntityService extends BaseGraphqlService {
21115
21169
  const { data, total } = yield this.graphql.query({
21116
21170
  query,
21117
21171
  variables,
21118
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },
21172
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },
21119
21173
  fetchPolicy: opts && opts.fetchPolicy || 'network-only'
21120
21174
  });
21121
21175
  const entities = (!opts || opts.toEntity !== false) ?
@@ -21154,7 +21208,7 @@ class BaseEntityService extends BaseGraphqlService {
21154
21208
  variables: {
21155
21209
  filter: filter && filter.asPodObject()
21156
21210
  },
21157
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.COUNT_DATA_ERROR' },
21211
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'ERROR.COUNT_DATA_ERROR' },
21158
21212
  fetchPolicy: opts && opts.fetchPolicy || 'network-only'
21159
21213
  });
21160
21214
  return res.total;
@@ -21190,7 +21244,7 @@ class BaseEntityService extends BaseGraphqlService {
21190
21244
  variables: {
21191
21245
  data: json
21192
21246
  },
21193
- error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
21247
+ error: { code: ErrorCodes$2.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
21194
21248
  update: (proxy, { data }) => {
21195
21249
  const savedEntities = data && data.data;
21196
21250
  if (savedEntities) {
@@ -21246,7 +21300,7 @@ class BaseEntityService extends BaseGraphqlService {
21246
21300
  variables: {
21247
21301
  data: json
21248
21302
  },
21249
- error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
21303
+ error: { code: ErrorCodes$2.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
21250
21304
  update: (cache, { data }) => {
21251
21305
  // Update entity
21252
21306
  const savedEntity = data && data.data;
@@ -21294,7 +21348,7 @@ class BaseEntityService extends BaseGraphqlService {
21294
21348
  refetchQueries: this.getRefetchQueriesForMutation(opts),
21295
21349
  awaitRefetchQueries: opts && opts.awaitRefetchQueries,
21296
21350
  variables: { ids },
21297
- error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
21351
+ error: { code: ErrorCodes$2.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
21298
21352
  update: (cache, res) => {
21299
21353
  // Remove from cache
21300
21354
  if (this.watchQueriesUpdatePolicy === 'update-cache') {
@@ -21335,7 +21389,7 @@ class BaseEntityService extends BaseGraphqlService {
21335
21389
  refetchQueries: this.getRefetchQueriesForMutation(opts),
21336
21390
  awaitRefetchQueries: opts && opts.awaitRefetchQueries,
21337
21391
  variables: { id },
21338
- error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
21392
+ error: { code: ErrorCodes$2.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
21339
21393
  update: (proxy, res) => {
21340
21394
  // Remove from cache
21341
21395
  if (this.watchQueriesUpdatePolicy === 'update-cache') {
@@ -21371,7 +21425,7 @@ class BaseEntityService extends BaseGraphqlService {
21371
21425
  fetchPolicy: opts && opts.fetchPolicy || 'no-cache',
21372
21426
  variables,
21373
21427
  error: {
21374
- code: ErrorCodes.SUBSCRIBE_DATA_ERROR,
21428
+ code: ErrorCodes$2.SUBSCRIBE_DATA_ERROR,
21375
21429
  message: 'ERROR.SUBSCRIBE_DATA_ERROR'
21376
21430
  }
21377
21431
  })
@@ -21557,7 +21611,7 @@ class EntitiesTableDataSource extends TableDataSource {
21557
21611
  if (this._debug)
21558
21612
  invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._logTypeName} row #${row.id}`));
21559
21613
  // Stop with an error
21560
- throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
21614
+ throw { code: ErrorCodes$2.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
21561
21615
  }
21562
21616
  this._editingRowCount = 0;
21563
21617
  let data;
@@ -22428,14 +22482,14 @@ class AppTable {
22428
22482
  return __awaiter(this, void 0, void 0, function* () {
22429
22483
  opts = Object.assign({ keepEditing: this.keepEditedRowOnSave }, opts);
22430
22484
  if (this.readOnly) {
22431
- throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
22485
+ throw { code: ErrorCodes$2.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
22432
22486
  }
22433
22487
  this.resetError();
22434
22488
  // Keep edited row id (should be done BEFORE confirmEditCreate() )
22435
22489
  this.previouslyEditedRowId = opts.keepEditing ? ((((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.editing) ? this.editedRow.id : undefined) || ((_b = this.singleSelectedRow) === null || _b === void 0 ? void 0 : _b.id)) : undefined;
22436
22490
  const previouslyEditedData = opts.keepEditing ? (isNotNil(this.previouslyEditedRowId) && ((_c = this.editedRow) === null || _c === void 0 ? void 0 : _c.currentData) || ((_d = this.singleSelectedRow) === null || _d === void 0 ? void 0 : _d.currentData)) : undefined;
22437
22491
  if (!this.confirmEditCreate()) {
22438
- throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
22492
+ throw { code: ErrorCodes$2.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
22439
22493
  }
22440
22494
  // Mark as saving
22441
22495
  this.markAsSaving();
@@ -22554,7 +22608,7 @@ class AppTable {
22554
22608
  var _a;
22555
22609
  return __awaiter(this, void 0, void 0, function* () {
22556
22610
  if (this.readOnly) {
22557
- throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
22611
+ throw { code: ErrorCodes$2.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
22558
22612
  }
22559
22613
  if (event === null || event === void 0 ? void 0 : event.defaultPrevented)
22560
22614
  return 0; // SKip
@@ -24134,7 +24188,7 @@ class AppEntityEditor extends AppTabEditor {
24134
24188
  try {
24135
24189
  const data = yield this.dataService.load(id, opts);
24136
24190
  if (!data)
24137
- throw { code: ErrorCodes.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
24191
+ throw { code: ErrorCodes$2.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
24138
24192
  this._usageMode = this.computeUsageMode(data);
24139
24193
  yield this.onEntityLoaded(data, opts);
24140
24194
  yield this.updateView(data, opts);
@@ -25086,7 +25140,7 @@ class UserEventService extends BaseGraphqlService {
25086
25140
  EntityUtils.copyIdAndUpdateDate(source, target);
25087
25141
  }
25088
25142
  }
25089
- UserEventService.ɵprov = ɵɵdefineInjectable({ factory: function UserEventService_Factory() { return new UserEventService(ɵɵinject(GraphqlService), ɵɵinject(AccountService), ɵɵinject(NetworkService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT)); }, token: UserEventService, providedIn: "root" });
25143
+ UserEventService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserEventService_Factory() { return new UserEventService(i0.ɵɵinject(GraphqlService), i0.ɵɵinject(AccountService), i0.ɵɵinject(NetworkService), i0.ɵɵinject(i1$1.TranslateService), i0.ɵɵinject(i1$4.ToastController), i0.ɵɵinject(ENVIRONMENT)); }, token: UserEventService, providedIn: "root" });
25090
25144
  UserEventService.decorators = [
25091
25145
  { type: Injectable, args: [{ providedIn: 'root' },] }
25092
25146
  ];
@@ -25467,7 +25521,7 @@ class PersonService extends BaseEntityService {
25467
25521
  return target;
25468
25522
  }
25469
25523
  }
25470
- PersonService.ɵprov = ɵɵdefineInjectable({ factory: function PersonService_Factory() { return new PersonService(ɵɵinject(GraphqlService), ɵɵinject(PlatformService), ɵɵinject(NetworkService), ɵɵinject(EntitiesStorage)); }, token: PersonService, providedIn: "root" });
25524
+ 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" });
25471
25525
  PersonService.decorators = [
25472
25526
  { type: Injectable, args: [{ providedIn: 'root' },] }
25473
25527
  ];
@@ -25498,7 +25552,7 @@ class PersonValidatorService {
25498
25552
  return this.formBuilder.group(formConfig);
25499
25553
  }
25500
25554
  }
25501
- PersonValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
25555
+ PersonValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
25502
25556
  PersonValidatorService.decorators = [
25503
25557
  { type: Injectable, args: [{ providedIn: 'root' },] }
25504
25558
  ];
@@ -25692,16 +25746,16 @@ AdminModule.decorators = [
25692
25746
  ];
25693
25747
  AdminModule.ctorParameters = () => [];
25694
25748
 
25695
- const ɵ0$c = {
25749
+ const ɵ0 = {
25696
25750
  profile: 'ADMIN'
25697
25751
  };
25698
- const routes = [
25752
+ const routes$5 = [
25699
25753
  {
25700
25754
  path: 'users',
25701
25755
  pathMatch: 'full',
25702
25756
  component: UsersPage,
25703
25757
  canActivate: [AuthGuardService],
25704
- data: ɵ0$c
25758
+ data: ɵ0
25705
25759
  }
25706
25760
  ];
25707
25761
  class AdminRoutingModule {
@@ -25711,33 +25765,33 @@ AdminRoutingModule.decorators = [
25711
25765
  imports: [
25712
25766
  SharedRoutingModule,
25713
25767
  AdminModule,
25714
- RouterModule.forChild(routes)
25768
+ RouterModule.forChild(routes$5)
25715
25769
  ],
25716
25770
  exports: [RouterModule]
25717
25771
  },] }
25718
25772
  ];
25719
25773
 
25720
- const ErrorCodes$2 = {
25774
+ const ErrorCodes = {
25721
25775
  LOAD_PERSONS_ERROR: 100,
25722
25776
  SAVE_PERSONS_ERROR: 101,
25723
25777
  DELETE_PERSONS_ERROR: 102,
25724
25778
  };
25725
25779
 
25726
- class EntityTestClass {
25780
+ class EntityTestClass$1 {
25727
25781
  }
25728
- const FAKE_ENTITIES = [
25782
+ const FAKE_ENTITIES$1 = [
25729
25783
  { id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments... again for A' },
25730
25784
  { id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments... again for B' },
25731
25785
  { id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments... again for C' }
25732
25786
  ];
25733
- function deepCopy(values, size) {
25787
+ function deepCopy$1(values, size) {
25734
25788
  if (isNil(size)) {
25735
- return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
25789
+ return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
25736
25790
  }
25737
25791
  let result = [];
25738
25792
  let i = 1;
25739
25793
  while (result.length < size) {
25740
- result = result.concat((values || FAKE_ENTITIES).map(entity => {
25794
+ result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
25741
25795
  const name = entity.name + ' #' + i;
25742
25796
  return Object.assign(Object.assign({}, entity), { id: i++, name });
25743
25797
  }));
@@ -25747,7 +25801,7 @@ function deepCopy(values, size) {
25747
25801
  class AutocompleteTestPage {
25748
25802
  constructor(formBuilder) {
25749
25803
  this.formBuilder = formBuilder;
25750
- this._items = deepCopy(FAKE_ENTITIES, 100);
25804
+ this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
25751
25805
  this._$items = new BehaviorSubject(undefined);
25752
25806
  this.autocompleteFields = new MatAutocompleteConfigHolder();
25753
25807
  this.memoryHide = false;
@@ -25758,6 +25812,7 @@ class AutocompleteTestPage {
25758
25812
  entity: [null, SharedValidators.entity],
25759
25813
  missingEntity: [null, SharedValidators.entity],
25760
25814
  disableEntity: [null, SharedValidators.entity],
25815
+ entities: [null, SharedFormArrayValidators.requiredArrayMinLength(1)],
25761
25816
  });
25762
25817
  this.form.get('disableEntity').disable();
25763
25818
  }
@@ -25791,22 +25846,32 @@ class AutocompleteTestPage {
25791
25846
  });
25792
25847
  // From items
25793
25848
  this.autocompleteFields.add('entity-items-large', {
25794
- items: FAKE_ENTITIES.slice(),
25849
+ items: FAKE_ENTITIES$1.slice(),
25795
25850
  attributes: ['label', 'name', 'description', 'comments'],
25796
25851
  displayWith: this.entityToString
25797
25852
  });
25853
+ // For mutliple value
25854
+ this.autocompleteFields.add('entities-items-filter', {
25855
+ service: {
25856
+ suggest: (value, filter) => this.suggest(value, filter)
25857
+ },
25858
+ attributes: ['label', 'name'],
25859
+ multiple: true
25860
+ //displayWith: this.entitiesToString
25861
+ });
25798
25862
  this.loadData();
25799
25863
  }
25800
25864
  // Load the form with data
25801
25865
  loadData() {
25802
25866
  return __awaiter(this, void 0, void 0, function* () {
25803
25867
  const data = {
25804
- entity: deepCopy(FAKE_ENTITIES)[0],
25868
+ entity: deepCopy$1(FAKE_ENTITIES$1)[0],
25805
25869
  // This item is NOT in the items list => i should be displayed anyway
25806
25870
  missingEntity: {
25807
25871
  id: -1, label: '??', name: 'Missing item'
25808
25872
  },
25809
- disableEntity: deepCopy(FAKE_ENTITIES)[2]
25873
+ disableEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
25874
+ entities: deepCopy$1(FAKE_ENTITIES$1)
25810
25875
  };
25811
25876
  this.form.setValue(data);
25812
25877
  // Load observables
@@ -25821,6 +25886,9 @@ class AutocompleteTestPage {
25821
25886
  entityToString(item) {
25822
25887
  return [item && item.label || undefined, item && item.name || undefined].filter(isNotNil).join(' - ');
25823
25888
  }
25889
+ entitiesToString(items) {
25890
+ return (items || []).map(this.entityToString).join(', ');
25891
+ }
25824
25892
  suggest(value, filter) {
25825
25893
  return __awaiter(this, void 0, void 0, function* () {
25826
25894
  filter = Object.assign({ offset: 0, size: 30 }, filter);
@@ -25864,9 +25932,10 @@ class AutocompleteTestPage {
25864
25932
  this.memoryTimer = null;
25865
25933
  this.memoryHide = false;
25866
25934
  }
25867
- updateFilter(fieldName) {
25935
+ updateFilter(autocompleteField, fieldName) {
25868
25936
  const filter = this.autocompleteFields.get(fieldName).filter || {};
25869
25937
  filter.searchAttribute = (!filter || filter.searchAttribute !== 'name') ? 'name' : 'label';
25938
+ autocompleteField.reloadItems();
25870
25939
  }
25871
25940
  /* -- protected methods -- */
25872
25941
  stringify(value) {
@@ -25876,7 +25945,7 @@ class AutocompleteTestPage {
25876
25945
  AutocompleteTestPage.decorators = [
25877
25946
  { type: Component, args: [{
25878
25947
  selector: 'app-autocomplete-test',
25879
- template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Autocomplete field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n\n <!-- Tab nav - mobile/desktop mode -->\n <nav mat-tab-nav-bar>\n <a mat-tab-link\n [active]=\"mode==='mobile'\"\n (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='desktop'\"\n (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='memory'\"\n (click)=\"toggleMode('memory')\">\n <mat-label>Memory leak debug</mat-label>\n </a>\n <a mat-tab-link\n [active]=\"mode==='temp'\"\n (click)=\"toggleMode('temp')\">\n <mat-label>Temporary</mat-label>\n </a>\n </nav>\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <!--<ion-grid *ngIf=\"mode === 'temp'\">\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n </ion-row>\n\n\n </ion-grid>-->\n\n\n <ion-grid *ngIf=\"mode === 'memory'\">\n\n <!-- debugging memory leak -->\n <ion-row>\n <ion-col>\n <ion-text><h4>Debug memory leak</h4></ion-text>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"always\">\n <input matInput type=\"text\" hidden placeholder=\"Items type\">\n <mat-select (selectionChange)=\"memoryAutocompleteFieldName=$event.value\" [value]=\"memoryAutocompleteFieldName\">\n <mat-option value=\"entity-$items\">Observable</mat-option>\n <mat-option value=\"entity-suggestFn\">Suggest function</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"1\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"always\">\n <input matInput type=\"text\" hidden placeholder=\"Mobile ?\">\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [checked]=\"memoryMobile\">\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\" color=\"tertiary\">Start</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\" color=\"tertiary\">Stop</ion-button>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n *ngIf=\"!memoryHide && memoryAutocompleteFieldName\"\n [config]=\"autocompleteFields.get(memoryAutocompleteFieldName)\"\n [mobile]=\"memoryMobile\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-memory-leak]'\">\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n <!-- Mobile mode -->\n <ion-grid *ngIf=\"mode === 'mobile'\">\n\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Suggest() function\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>mobile: true, suggestFn: (searchText, filter) =&gt; any[]</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-suggestFn')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-1]'\"\n [required]=\"true\"\n placeholder=\"Suggest field\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Items is an Observable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>mobile: true, items: Observable&lt;any[]&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-observable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>mobile: true, items: Observable&lt;any[]&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Change filter\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre></pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <ion-button (click)=\"updateFilter('entity-items-filter')\">Filter on: {{autocompleteFields.get('entity-items-filter').filter?.searchAttribute }}</ion-button>\n </ion-col>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-filter]'\"\n ></mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>class=\"min-width-large\"</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"true\"\n class=\"min-width-large\"\n panelWidth=\"400px\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Readonly toggle\n </ion-text>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid>\n <ion-row>\n <ion-col size=\"3\">\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n Readonly ?\n </mat-checkbox>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-autocomplete-field #readonlyField formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-readonly]'\"\n [readonly]=\"true\"\n [clearable]=\"!readonlyField.readonly\">\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Desktop mode -->\n <ion-grid *ngIf=\"mode === 'desktop'\">\n <ion-row>\n <ion-col>\n <ion-text><h4>Desktop mode</h4></ion-text>\n </ion-col>\n </ion-row>\n <ion-row>\n\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n items from suggest function\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>suggest: (value, filter) => LoadResult&lt;any&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-suggest]'\">\n </mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n search with a suggestLengthThreshold\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>suggest: (value, filter) => LoadResult&lt;any&gt;\nsuggestLengthThreshold: '3'</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n suggestLengthThreshold=\"3\"\n [logPrefix]=\"'[combo-desktop-suggest]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an array\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>items: [], value: {{stringify(form.controls.entity.value)}}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items')\"\n [logPrefix]=\"'[combo-desktop-array-1]'\"\n [equals]=\"equals\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>items: Observable&lt;any[]&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [equals]=\"equals\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>items: Observable&lt;any[]&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-missing]'\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size panel\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>class: 'mat-autocomplete-panel-full-size'</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [class]=\"'mat-autocomplete-panel-full-size'\"\n [matAutocompletePosition]=\"'above'\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n [debug]=\"true\"\n [showAllOnFocus]=\"true\"\n [showPanelOnFocus]=\"true\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-disable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>class=\"mat-autocomplete-panel-full-size\"</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n class=\"mat-autocomplete-panel-full-size\"\n panelWidth=\"100vw\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>panelWidth: string</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n panelWidth=\"400px\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Readonly toggle\n </ion-text>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid>\n <ion-row>\n <ion-col size=\"3\">\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n Readonly ?\n </mat-checkbox>\n </ion-col>\n <ion-col size=\"3\">\n <mat-checkbox #showIcons [checked]=\"false\">\n Icons ?\n </mat-checkbox>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-autocomplete-field #readonlyField formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\"\n [clearable]=\"!readonlyField.readonly\">\n <mat-icon matPrefix *ngIf=\"showIcons.checked\">keyboard_arrow_right</mat-icon>\n <mat-icon matSuffix *ngIf=\"showIcons.checked\">keyboard_arrow_left</mat-icon>\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </form>\n\n</ion-content>\n"
25948
+ template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Autocomplete field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n\n <!-- Tab nav - mobile/desktop mode -->\n <nav mat-tab-nav-bar>\n <a mat-tab-link\n [active]=\"mode==='mobile'\"\n (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='desktop'\"\n (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='memory'\"\n (click)=\"toggleMode('memory')\">\n <mat-label>Memory leak debug</mat-label>\n </a>\n <a mat-tab-link\n [active]=\"mode==='temp'\"\n (click)=\"toggleMode('temp')\">\n <mat-label>Temporary</mat-label>\n </a>\n </nav>\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <!--<ion-grid *ngIf=\"mode === 'temp'\">\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n </ion-row>\n\n\n </ion-grid>-->\n\n\n <ion-grid *ngIf=\"mode === 'memory'\">\n\n <!-- debugging memory leak -->\n <ion-row>\n <ion-col>\n <ion-text><h4>Debug memory leak</h4></ion-text>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"always\">\n <input matInput type=\"text\" hidden placeholder=\"Items type\">\n <mat-select (selectionChange)=\"memoryAutocompleteFieldName=$event.value\" [value]=\"memoryAutocompleteFieldName\">\n <mat-option value=\"entity-$items\">Observable</mat-option>\n <mat-option value=\"entity-suggestFn\">Suggest function</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"1\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"always\">\n <input matInput type=\"text\" hidden placeholder=\"Mobile ?\">\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [checked]=\"memoryMobile\">\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\" color=\"tertiary\">Start</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\" color=\"tertiary\">Stop</ion-button>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n *ngIf=\"!memoryHide && memoryAutocompleteFieldName\"\n [config]=\"autocompleteFields.get(memoryAutocompleteFieldName)\"\n [mobile]=\"memoryMobile\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-memory-leak]'\">\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n <!-- Mobile mode -->\n <ion-grid *ngIf=\"mode === 'mobile'\">\n\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Suggest() function\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>mobile: true, suggestFn: (searchText, filter) =&gt; any[]</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-suggestFn')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-1]'\"\n [required]=\"true\"\n placeholder=\"Suggest field\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Items is an Observable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>mobile: true, items: Observable&lt;any[]&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-observable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>mobile: true, items: Observable&lt;any[]&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n search with a suggestLengthThreshold\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>suggest: (value, filter) => LoadResult&lt;any&gt;\nsuggestLengthThreshold: '3'</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n suggestLengthThreshold=\"3\"\n [logPrefix]=\"'[combo-mobile-suggestLengthThreshold]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Multiple value\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>multiple: true</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entities\"\n [config]=\"autocompleteFields.get('entities-items-filter')\"\n [placeholder]=\"'Multiple'\"\n mobile=\"true\"\n multiple=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-multiple]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Change filter\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre></pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <ion-button (click)=\"updateFilter(filterChangeField, 'entity-items-filter')\">Filter on: {{autocompleteFields.get('entity-items-filter').filter?.searchAttribute }}</ion-button>\n </ion-col>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\" #filterChangeField\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-filter]'\"\n ></mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>class=\"min-width-large\"</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"true\"\n class=\"min-width-large\"\n panelWidth=\"400px\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Readonly toggle\n </ion-text>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid>\n <ion-row>\n <ion-col size=\"3\">\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n Readonly ?\n </mat-checkbox>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-autocomplete-field #readonlyField formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-mobile-readonly]'\"\n [readonly]=\"true\"\n [clearable]=\"!readonlyField.readonly\">\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Fullscreen\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>class: 'mat-autocomplete-panel-full-size'</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [class]=\"'mat-autocomplete-panel-full-size'\"\n [matAutocompletePosition]=\"'above'\"\n [logPrefix]=\"'[combo-mobile-full-size]'\"\n [debug]=\"true\"\n [showAllOnFocus]=\"true\"\n [showPanelOnFocus]=\"true\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Desktop mode -->\n <ion-grid *ngIf=\"mode === 'desktop'\">\n <ion-row>\n <ion-col>\n <ion-text><h4>Desktop mode</h4></ion-text>\n </ion-col>\n </ion-row>\n <ion-row>\n\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n items from suggest function\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>suggest: (value, filter) => LoadResult&lt;any&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-suggest]'\">\n </mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n search with a suggestLengthThreshold\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>suggest: (value, filter) => LoadResult&lt;any&gt;\nsuggestLengthThreshold: '3'</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n suggestLengthThreshold=\"3\"\n [logPrefix]=\"'[combo-desktop-suggestLengthThreshold]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an array\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>items: [], value: {{stringify(form.controls.entity.value)}}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items')\"\n [logPrefix]=\"'[combo-desktop-array-1]'\"\n [equals]=\"equals\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>items: Observable&lt;any[]&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [equals]=\"equals\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Multiple value\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>multiple: true</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entities\"\n [config]=\"autocompleteFields.get('entities-items-filter')\"\n [placeholder]=\"'Multiple'\"\n mobile=\"false\"\n multiple=\"true\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-multiple]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>items: Observable&lt;any[]&gt;</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-missing]'\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size panel\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>class: 'mat-autocomplete-panel-full-size'</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [class]=\"'mat-autocomplete-panel-full-size'\"\n [matAutocompletePosition]=\"'above'\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n [debug]=\"true\"\n [showAllOnFocus]=\"true\"\n [showPanelOnFocus]=\"true\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-disable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>class=\"mat-autocomplete-panel-full-size\"</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n class=\"mat-autocomplete-panel-full-size\"\n panelWidth=\"100vw\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>panelWidth: string</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n panelWidth=\"400px\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Readonly toggle\n </ion-text>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid>\n <ion-row>\n <ion-col size=\"3\">\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n Readonly ?\n </mat-checkbox>\n </ion-col>\n <ion-col size=\"3\">\n <mat-checkbox #showIcons [checked]=\"false\">\n Icons ?\n </mat-checkbox>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-autocomplete-field #readonlyField formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [equals]=\"equals\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\"\n [clearable]=\"!readonlyField.readonly\">\n <mat-icon matPrefix *ngIf=\"showIcons.checked\">keyboard_arrow_right</mat-icon>\n <mat-icon matSuffix *ngIf=\"showIcons.checked\">keyboard_arrow_left</mat-icon>\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </form>\n\n</ion-content>\n"
25880
25949
  },] }
25881
25950
  ];
25882
25951
  AutocompleteTestPage.ctorParameters = () => [
@@ -25949,13 +26018,13 @@ LatLongTestPage.ctorParameters = () => [
25949
26018
  { type: FormBuilder }
25950
26019
  ];
25951
26020
 
25952
- const moment$5 = momentImported;
26021
+ const moment$2 = momentImported;
25953
26022
  class SwipeTestPage {
25954
26023
  constructor(formBuilder, dateFormatPipe) {
25955
26024
  this.formBuilder = formBuilder;
25956
26025
  this.dateFormatPipe = dateFormatPipe;
25957
26026
  this.$dates = new BehaviorSubject(undefined);
25958
- this._today = moment$5().startOf('day');
26027
+ this._today = moment$2().startOf('day');
25959
26028
  this.form = formBuilder.group({
25960
26029
  empty: [null, Validators.required],
25961
26030
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -25968,7 +26037,7 @@ class SwipeTestPage {
25968
26037
  ngOnInit() {
25969
26038
  const dates = [];
25970
26039
  for (let d = 0; d < 7; d++) {
25971
- dates[d] = moment$5(this._today).add(d - 3, 'day');
26040
+ dates[d] = moment$2(this._today).add(d - 3, 'day');
25972
26041
  }
25973
26042
  this.$dates.next(dates);
25974
26043
  this.loadData();
@@ -26009,7 +26078,7 @@ SwipeTestPage.ctorParameters = () => [
26009
26078
  { type: DateFormatPipe }
26010
26079
  ];
26011
26080
 
26012
- const moment$6 = momentImported;
26081
+ const moment$1 = momentImported;
26013
26082
  class DateTimeTestPage {
26014
26083
  constructor(platform, formBuilder, cd) {
26015
26084
  this.platform = platform;
@@ -26041,7 +26110,7 @@ class DateTimeTestPage {
26041
26110
  // Load the form with data
26042
26111
  loadData() {
26043
26112
  return __awaiter(this, void 0, void 0, function* () {
26044
- const now = moment$6();
26113
+ const now = moment$1();
26045
26114
  const data = {
26046
26115
  empty: toDateISOString(now.clone().add(2, 'hours')),
26047
26116
  enable: toDateISOString(now),
@@ -26102,9 +26171,9 @@ DateTimeTestPage.ctorParameters = () => [
26102
26171
  { type: ChangeDetectorRef }
26103
26172
  ];
26104
26173
 
26105
- class EntityTestClass$1 {
26174
+ class EntityTestClass {
26106
26175
  }
26107
- const FAKE_ENTITIES$1 = [
26176
+ const FAKE_ENTITIES = [
26108
26177
  { id: 1, label: 'AAA', name: 'Item A' },
26109
26178
  { id: 2, label: 'BBB', name: 'Item B' },
26110
26179
  { id: 3, label: 'CCC', name: 'Item C' },
@@ -26113,14 +26182,14 @@ const FAKE_ENTITIES$1 = [
26113
26182
  { id: 6, label: 'FFF', name: 'Item F' },
26114
26183
  { id: 7, label: 'GGG', name: 'Item G' }
26115
26184
  ];
26116
- function deepCopy$1(values, size) {
26185
+ function deepCopy(values, size) {
26117
26186
  if (isNil(size)) {
26118
- return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
26187
+ return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
26119
26188
  }
26120
26189
  let result = [];
26121
26190
  let i = 1;
26122
26191
  while (result.length < size) {
26123
- result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
26192
+ result = result.concat((values || FAKE_ENTITIES).map(entity => {
26124
26193
  const name = entity.name + ' #' + i;
26125
26194
  return Object.assign(Object.assign({}, entity), { id: i++, name });
26126
26195
  }));
@@ -26130,7 +26199,7 @@ function deepCopy$1(values, size) {
26130
26199
  class ChipsTestPage {
26131
26200
  constructor(formBuilder) {
26132
26201
  this.formBuilder = formBuilder;
26133
- this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
26202
+ this._items = deepCopy(FAKE_ENTITIES, 100);
26134
26203
  this._$items = new BehaviorSubject(undefined);
26135
26204
  this.autocompleteFields = new MatAutocompleteConfigHolder();
26136
26205
  this.form = formBuilder.group({
@@ -26169,7 +26238,7 @@ class ChipsTestPage {
26169
26238
  // Load the form with data
26170
26239
  loadData() {
26171
26240
  return __awaiter(this, void 0, void 0, function* () {
26172
- const items = deepCopy$1(FAKE_ENTITIES$1);
26241
+ const items = deepCopy(FAKE_ENTITIES);
26173
26242
  const data = {
26174
26243
  entity: items.slice(0, 1),
26175
26244
  entityInitial: items.slice(1, 2),
@@ -26285,7 +26354,7 @@ NumpadTestPage.ctorParameters = () => [
26285
26354
  { type: FormBuilder }
26286
26355
  ];
26287
26356
 
26288
- const moment$7 = momentImported;
26357
+ const moment = momentImported;
26289
26358
  class DateTestPage {
26290
26359
  constructor(platform, formBuilder, cd) {
26291
26360
  this.platform = platform;
@@ -26319,7 +26388,7 @@ class DateTestPage {
26319
26388
  // Load the form with data
26320
26389
  loadData() {
26321
26390
  return __awaiter(this, void 0, void 0, function* () {
26322
- const now = moment$7();
26391
+ const now = moment();
26323
26392
  const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
26324
26393
  const data = {
26325
26394
  empty: toDateISOString(now.clone().add(2, 'hours')),
@@ -26397,7 +26466,7 @@ const SHARED_MATERIAL_TESTING_PAGES = [
26397
26466
  { label: 'Shared directives', divider: true },
26398
26467
  { label: 'Badge icon directive', page: '/testing/shared/badge-icon' }
26399
26468
  ];
26400
- const routes$1 = [
26469
+ const routes$4 = [
26401
26470
  {
26402
26471
  path: '',
26403
26472
  pathMatch: 'full',
@@ -26454,7 +26523,7 @@ MaterialTestingModule.decorators = [
26454
26523
  ReactiveFormsModule,
26455
26524
  SharedMaterialModule,
26456
26525
  TranslateModule.forChild(),
26457
- RouterModule.forChild(routes$1)
26526
+ RouterModule.forChild(routes$4)
26458
26527
  ],
26459
26528
  declarations: [
26460
26529
  DateTimeTestPage,
@@ -26515,7 +26584,7 @@ ToastTestingPage.ctorParameters = () => [
26515
26584
  { type: TranslateService }
26516
26585
  ];
26517
26586
 
26518
- const routes$2 = [
26587
+ const routes$3 = [
26519
26588
  {
26520
26589
  path: 'toast',
26521
26590
  pathMatch: 'full',
@@ -26530,7 +26599,7 @@ ToastTestingModule.decorators = [
26530
26599
  CommonModule,
26531
26600
  IonicModule,
26532
26601
  TranslateModule.forChild(),
26533
- RouterModule.forChild(routes$2)
26602
+ RouterModule.forChild(routes$3)
26534
26603
  ],
26535
26604
  declarations: [
26536
26605
  ToastTestingPage
@@ -26593,7 +26662,7 @@ UploadFileTestingPage.ctorParameters = () => [
26593
26662
  { type: PopoverController }
26594
26663
  ];
26595
26664
 
26596
- const routes$3 = [
26665
+ const routes$2 = [
26597
26666
  {
26598
26667
  path: 'upload-file',
26599
26668
  pathMatch: 'full',
@@ -26608,7 +26677,7 @@ UploadFileTestingModule.decorators = [
26608
26677
  CommonModule,
26609
26678
  IonicModule,
26610
26679
  TranslateModule.forChild(),
26611
- RouterModule.forChild(routes$3)
26680
+ RouterModule.forChild(routes$2)
26612
26681
  ],
26613
26682
  declarations: [
26614
26683
  UploadFileTestingPage
@@ -26989,7 +27058,7 @@ TextPopoverTestingPage.ctorParameters = () => [
26989
27058
  { type: PopoverController }
26990
27059
  ];
26991
27060
 
26992
- const routes$4 = [
27061
+ const routes$1 = [
26993
27062
  {
26994
27063
  path: 'text-popover',
26995
27064
  pathMatch: 'full',
@@ -27004,7 +27073,7 @@ TextPopoverTestingModule.decorators = [
27004
27073
  CommonModule,
27005
27074
  IonicModule,
27006
27075
  TranslateModule.forChild(),
27007
- RouterModule.forChild(routes$4)
27076
+ RouterModule.forChild(routes$1)
27008
27077
  ],
27009
27078
  declarations: [
27010
27079
  TextPopoverTestingPage
@@ -27021,7 +27090,7 @@ const CORE_TESTING_PAGES = [
27021
27090
  { label: 'Table', page: '/testing/core/table' },
27022
27091
  { label: 'Text popover', page: '/testing/core/text-popover' }
27023
27092
  ];
27024
- const routes$5 = [
27093
+ const routes = [
27025
27094
  {
27026
27095
  path: '',
27027
27096
  pathMatch: 'full',
@@ -27045,7 +27114,7 @@ CoreTestingModule.decorators = [
27045
27114
  imports: [
27046
27115
  CommonModule,
27047
27116
  TranslateModule.forChild(),
27048
- RouterModule.forChild(routes$5),
27117
+ RouterModule.forChild(routes),
27049
27118
  // Sub modules
27050
27119
  TableTestingModule,
27051
27120
  TextPopoverTestingModule
@@ -27065,5 +27134,5 @@ CoreTestingModule.decorators = [
27065
27134
  * Generated bundle index. Do not edit.
27066
27135
  */
27067
27136
 
27068
- 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_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes$2 as ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, Fragments$1 as Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, 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, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0$1 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, AppIconComponent as ɵi, DateTestPage as ɵj, NumpadTestPage as ɵk, MatBadgeIconTestPage as ɵl, ToastTestingModule as ɵm, ToastTestingPage as ɵn };
27137
+ 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_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, 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, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, 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, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0$b 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, AppIconComponent as ɵi, DateTestPage as ɵj, NumpadTestPage as ɵk, MatBadgeIconTestPage as ɵl, ToastTestingModule as ɵm, ToastTestingPage as ɵn };
27069
27138
  //# sourceMappingURL=sumaris-net.ngx-components.js.map