@sumaris-net/ngx-components 1.22.12 → 1.23.0-rc3

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, MatColumnDef, MatTable } from '@angular/material/table';
9
12
  import { MatSortModule, MatSort } from '@angular/material/sort';
@@ -27,17 +30,22 @@ 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 { Validators, NG_VALUE_ACCESSOR, FormGroupDirective, AbstractControl, FormGroup, FormArray, FormControl, ReactiveFormsModule, FormBuilder } from '@angular/forms';
34
39
  import { timer, merge, fromEvent, BehaviorSubject, Subscription, Subject, isObservable, from, of, noop as noop$9, Observable, defer, forkJoin, interval, combineLatest, EMPTY } from 'rxjs';
35
40
  import { filter, first, map, takeUntil, switchMap, tap, debounceTime, startWith, distinctUntilChanged, mergeMap, catchError, throttleTime, skip, bufferWhen, take } from 'rxjs/operators';
36
41
  import { trigger, transition, style, animate, state } from '@angular/animations';
42
+ import * as i1$1 from '@ngx-translate/core';
37
43
  import { TranslateService, TranslateModule } from '@ngx-translate/core';
44
+ import * as i1$4 from '@ionic/angular';
38
45
  import { IonicModule, Platform, IonRouterOutlet, ModalController, PopoverController, IonicSafeString, createAnimation, ToastController, AlertController, IonicRouteStrategy, NavParams, MenuController, IonContent, IonItem, IonInfiniteScroll } from '@ionic/angular';
39
46
  import * as momentImported from 'moment';
40
47
  import { isMoment } from 'moment';
48
+ import * as i1 from '@angular/material-moment-adapter';
41
49
  import { MomentDateAdapter, MatMomentDateModule } from '@angular/material-moment-adapter';
42
50
  import { Keyboard } from '@ionic-native/keyboard/ngx';
43
51
  import { TextMaskModule } from 'angular2-text-mask';
@@ -46,33 +54,38 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
46
54
  import { MatDividerModule } from '@angular/material/divider';
47
55
  import { MatTooltipModule } from '@angular/material/tooltip';
48
56
  import { MatChipsModule } from '@angular/material/chips';
57
+ import * as i3$3 from '@angular/router';
49
58
  import { ActivatedRoute, Router, RouterModule, RouteReuseStrategy } from '@angular/router';
59
+ import * as i1$5 from '@angular/platform-browser';
50
60
  import { HammerGestureConfig, EventManager } from '@angular/platform-browser';
61
+ import * as i2$2 from '@angular/common/http';
51
62
  import { HttpResponse, HttpEventType, HttpClient, HttpHeaders, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
52
63
  import { ColorPickerModule } from 'ngx-color-picker';
53
- import { NativeAudio as NativeAudio$1 } from '@ionic-native/native-audio/ngx';
54
- import { Vibration as Vibration$1 } from '@ionic-native/vibration/ngx';
64
+ import { NativeAudio } from '@ionic-native/native-audio/ngx';
65
+ import { Vibration } from '@ionic-native/vibration/ngx';
55
66
  import { AudioManagement } from '@ionic-native/audio-management/ngx';
56
- import { NativeAudio } from '@ionic-native/native-audio/ngx/index';
57
- import { Vibration } from '@ionic-native/vibration/ngx/index';
58
- import { AudioManagement as AudioManagement$1 } from '@ionic-native/audio-management/ngx/index';
67
+ import * as i2 from '@ionic-native/native-audio/ngx/index';
68
+ import * as i3 from '@ionic-native/vibration/ngx/index';
69
+ import * as i4 from '@ionic-native/audio-management/ngx/index';
59
70
  import * as uuidv4Imported from 'uuid/v4';
60
- import { mergeMap as mergeMap$1 } from 'rxjs/internal/operators';
61
71
  import { DragDropModule } from '@angular/cdk/drag-drop';
62
72
  import { MarkdownModule } from 'ngx-markdown';
63
73
  import { sign, box, hash, verify } from 'tweetnacl';
74
+ import * as i3$1 from '@ionic/storage';
64
75
  import { Storage, IonicStorageModule } from '@ionic/storage';
65
76
  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';
77
+ import { SplashScreen } from '@ionic-native/splash-screen/ngx';
78
+ import { Connection, Network } from '@ionic-native/network/ngx';
79
+ import { CacheService, CacheModule } from 'ionic-cache';
80
+ import * as i6 from 'ionic-cache/dist/cache.service';
81
+ import * as i9 from '@ionic-native/network/ngx/index';
82
+ import * as i10 from '@ionic-native/splash-screen/ngx/index';
83
+ import { StatusBar } from '@ionic-native/status-bar/ngx';
84
+ import * as i2$4 from '@angular/cdk/platform';
73
85
  import { Platform as Platform$1 } from '@angular/cdk/platform';
74
- import { InAppBrowser as InAppBrowser$1 } from '@ionic-native/in-app-browser/ngx';
86
+ import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
75
87
  import { ApolloLink, NetworkStatus, InMemoryCache, ApolloClient, gql } from '@apollo/client/core';
88
+ import * as i2$3 from 'apollo-angular';
76
89
  import { Apollo } from 'apollo-angular';
77
90
  import { WebSocketLink } from '@apollo/client/link/ws';
78
91
  import { getMainDefinition } from '@apollo/client/utilities';
@@ -80,13 +93,14 @@ import { RetryLink } from '@apollo/client/link/retry';
80
93
  import QueueLink from 'apollo-link-queue';
81
94
  import SerializingLink from 'apollo-link-serialize';
82
95
  import loggerLink from 'apollo-link-logger';
96
+ import * as i3$2 from 'apollo-angular/http';
83
97
  import { HttpLink } from 'apollo-angular/http';
84
98
  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';
99
+ import { NotificationVisibility, Downloader } from '@ionic-native/downloader/ngx';
100
+ import * as i14 from '@ionic-native/status-bar/ngx/index';
101
+ import * as i15 from '@ionic-native/keyboard/ngx/index';
102
+ import * as i17 from '@ionic-native/in-app-browser/ngx/index';
103
+ import * as i18 from '@ionic-native/downloader/ngx/index';
90
104
  import { CdkTextareaAutosize } from '@angular/cdk/text-field';
91
105
  import { ValidatorService, TableDataSource } from '@e-is/ngx-material-table';
92
106
  import { SelectionModel } from '@angular/cdk/collections';
@@ -480,6 +494,7 @@ function equals(o1, o2) {
480
494
  }
481
495
  return false;
482
496
  }
497
+ // @dynamic
483
498
  class Beans {
484
499
  /**
485
500
  * Copy a source object, by including only properties of the given dataType.
@@ -513,6 +528,15 @@ class Beans {
513
528
  return isNotNil(value);
514
529
  }) === -1;
515
530
  }
531
+ static collectById(array) {
532
+ return this.collectByProperty(array, 'id');
533
+ }
534
+ static collectByProperty(array, propertyName) {
535
+ return (array || []).reduce((res, item) => {
536
+ res['' + propertyName] = item;
537
+ return res;
538
+ }, {});
539
+ }
516
540
  }
517
541
 
518
542
  function isFocusableElement(object) {
@@ -1036,7 +1060,7 @@ const isIpad = (win) => {
1036
1060
  }
1037
1061
  return false;
1038
1062
  };
1039
- const ɵ0 = isIpad;
1063
+ const ɵ0$c = isIpad;
1040
1064
  const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
1041
1065
  const isAndroid = (win) => testUserAgent(win, /android|sink/i);
1042
1066
  const isCordova = (win) => {
@@ -1168,14 +1192,14 @@ class MatAutocompleteFieldUtils {
1168
1192
  return isNotNil(o1 === null || o1 === void 0 ? void 0 : o1.id) && o1.id === (o2 === null || o2 === void 0 ? void 0 : o2.id);
1169
1193
  }
1170
1194
  }
1171
- const noop = (_) => { };
1172
- const ɵ0$1 = noop;
1195
+ const noop$8 = (_) => { };
1196
+ const ɵ0$b = noop$8;
1173
1197
  class MatAutocompleteField {
1174
1198
  constructor(cd, formGroupDir) {
1175
1199
  this.cd = cd;
1176
1200
  this.formGroupDir = formGroupDir;
1177
- this._onChangeCallback = noop;
1178
- this._onTouchedCallback = noop;
1201
+ this._onChangeCallback = noop$8;
1202
+ this._onTouchedCallback = noop$8;
1179
1203
  this.logPrefix = '[mat-autocomplete] ';
1180
1204
  this.formControlName = null;
1181
1205
  this.required = false;
@@ -1948,7 +1972,7 @@ class DateFormatPipe {
1948
1972
  return isMoment(value) ? value : this.dateAdapter.parse(value, parseFormat || DATE_ISO_PATTERN);
1949
1973
  }
1950
1974
  }
1951
- DateFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(ɵɵinject(MomentDateAdapter), ɵɵinject(TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1975
+ DateFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(i0.ɵɵinject(i1.MomentDateAdapter), i0.ɵɵinject(i1$1.TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1952
1976
  DateFormatPipe.decorators = [
1953
1977
  { type: Pipe, args: [{
1954
1978
  name: 'dateFormat'
@@ -1960,7 +1984,7 @@ DateFormatPipe.ctorParameters = () => [
1960
1984
  { type: TranslateService }
1961
1985
  ];
1962
1986
 
1963
- const moment = momentImported;
1987
+ const moment$a = momentImported;
1964
1988
  class DateDiffDurationPipe {
1965
1989
  constructor(dateAdapter, translate) {
1966
1990
  this.dateAdapter = dateAdapter;
@@ -1976,11 +2000,11 @@ class DateDiffDurationPipe {
1976
2000
  return this.format(startDate, endDate, args);
1977
2001
  }
1978
2002
  format(startDate, endDate, args) {
1979
- const duration = moment.duration(endDate.diff(startDate));
2003
+ const duration = moment$a.duration(endDate.diff(startDate));
1980
2004
  if (duration.asMinutes() < 0)
1981
2005
  return '';
1982
2006
  const withSeconds = args === null || args === void 0 ? void 0 : args.seconds;
1983
- const timeDuration = moment(0)
2007
+ const timeDuration = moment$a(0)
1984
2008
  .hour(duration.hours())
1985
2009
  .minute(duration.minutes());
1986
2010
  if (withSeconds) {
@@ -1990,7 +2014,7 @@ class DateDiffDurationPipe {
1990
2014
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + timeDuration.format(withSeconds ? 'HH:mm:ss' : 'HH:mm');
1991
2015
  }
1992
2016
  }
1993
- DateDiffDurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateDiffDurationPipe_Factory() { return new DateDiffDurationPipe(ɵɵinject(DateAdapter), ɵɵinject(TranslateService)); }, token: DateDiffDurationPipe, providedIn: "root" });
2017
+ 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" });
1994
2018
  DateDiffDurationPipe.decorators = [
1995
2019
  { type: Pipe, args: [{
1996
2020
  name: 'dateDiffDuration'
@@ -2011,7 +2035,7 @@ class DateFromNowPipe {
2011
2035
  return date ? date.fromNow(args && args.withoutSuffix) : '';
2012
2036
  }
2013
2037
  }
2014
- DateFromNowPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(ɵɵinject(MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
2038
+ DateFromNowPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(i0.ɵɵinject(i1.MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
2015
2039
  DateFromNowPipe.decorators = [
2016
2040
  { type: Pipe, args: [{
2017
2041
  name: 'dateFromNow'
@@ -2080,7 +2104,7 @@ function formatToDD(value, opts) {
2080
2104
  value *= -1;
2081
2105
  }
2082
2106
  }
2083
- let degrees = roundFloat(value, opts.maxDecimals).toString();
2107
+ let degrees = roundFloat$1(value, opts.maxDecimals).toString();
2084
2108
  // Add sign
2085
2109
  let sign = negative ? '-' : '+';
2086
2110
  if (opts.placeholderChar) {
@@ -2131,7 +2155,7 @@ function formatToDDMMSS(value, opts) {
2131
2155
  }
2132
2156
  let degrees = Math.trunc(value);
2133
2157
  let minutes = Math.trunc((value - degrees) * 60);
2134
- let seconds = roundFloat(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
2158
+ let seconds = roundFloat$1(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
2135
2159
  while (seconds >= 60) {
2136
2160
  seconds -= 60;
2137
2161
  minutes += 1;
@@ -2199,7 +2223,7 @@ function formatToDDMM(value, opts) {
2199
2223
  }
2200
2224
  }
2201
2225
  let degrees = Math.trunc(value);
2202
- let minutes = roundFloat((value - degrees) * 60, opts.maxDecimals);
2226
+ let minutes = roundFloat$1((value - degrees) * 60, opts.maxDecimals);
2203
2227
  while (minutes >= 60) {
2204
2228
  minutes -= 60;
2205
2229
  degrees += 1;
@@ -2250,15 +2274,15 @@ function parseLatitudeOrLongitude(input, pattern, maxDecimals, placeholderChar)
2250
2274
  return NaN;
2251
2275
  }
2252
2276
  if (pattern === 'DD')
2253
- return roundFloat(degrees, maxDecimals);
2277
+ return roundFloat$1(degrees, maxDecimals);
2254
2278
  const minutes = (pattern === 'DDMMSS' || pattern === 'DDMM') && parts[1] && parseFloat(parts[1].replace(/,/g, '.')) || 0;
2255
2279
  const seconds = (pattern === 'DDMMSS') && parts[2] && parseFloat(parts[2].replace(/,/g, '.')) || 0;
2256
2280
  const direction = ((pattern === 'DDMMSS') && parts[3]) || ((pattern === 'DDMM') && parts[2]) || undefined;
2257
2281
  const sign = (direction && (direction === 's' || direction === 'S' || direction === 'w' || direction === 'W')) ? -1 : 1;
2258
2282
  degrees = sign * (degrees + minutes / 60 + seconds / (60 * 60));
2259
- return roundFloat(degrees, maxDecimals);
2283
+ return roundFloat$1(degrees, maxDecimals);
2260
2284
  }
2261
- function roundFloat(input, maxDecimals) {
2285
+ function roundFloat$1(input, maxDecimals) {
2262
2286
  if (maxDecimals > 0) {
2263
2287
  const powDecimal = Math.pow(10, maxDecimals);
2264
2288
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -2319,7 +2343,7 @@ class NumberFormatPipe {
2319
2343
  }
2320
2344
  }
2321
2345
  }
2322
- NumberFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2346
+ NumberFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2323
2347
  NumberFormatPipe.decorators = [
2324
2348
  { type: Pipe, args: [{
2325
2349
  name: 'numberFormat'
@@ -2359,7 +2383,7 @@ class HighlightPipe {
2359
2383
  }
2360
2384
  }
2361
2385
  }
2362
- HighlightPipe.ɵprov = ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2386
+ HighlightPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2363
2387
  HighlightPipe.decorators = [
2364
2388
  { type: Pipe, args: [{
2365
2389
  name: 'highlight'
@@ -2424,7 +2448,7 @@ FileSizePipe.decorators = [
2424
2448
  { type: Pipe, args: [{ name: 'fileSize' },] }
2425
2449
  ];
2426
2450
 
2427
- const moment$1 = momentImported;
2451
+ const moment$9 = momentImported;
2428
2452
  const DATE_UNIX_TIMESTAMP = 'X';
2429
2453
  const DATE_UNIX_MS_TIMESTAMP = 'x';
2430
2454
  const MOMENT_NO_TIME_PROPERTY = '_hasNoTime';
@@ -2513,37 +2537,37 @@ function fromDateISOString(value) {
2513
2537
  return value;
2514
2538
  if (typeof value === 'string' && value.length === 10) {
2515
2539
  // Parse the input value, as a date only
2516
- const dateOnly = moment$1(value, DATE_PATTERN);
2540
+ const dateOnly = moment$9(value, DATE_PATTERN);
2517
2541
  if (dateOnly.isValid())
2518
2542
  return DateUtils.markNoTime(dateOnly);
2519
2543
  }
2520
2544
  // Parse the input value, as a ISO date time
2521
- const date = moment$1(value, DATE_ISO_PATTERN);
2545
+ const date = moment$9(value, DATE_ISO_PATTERN);
2522
2546
  if (date.isValid())
2523
2547
  return date;
2524
2548
  // Not valid: trying to convert from unix timestamp
2525
2549
  if (typeof value === 'string') {
2526
2550
  console.warn('Wrong date format - Trying to convert from local time: ' + value);
2527
2551
  if (value.length === 10) {
2528
- return moment$1(value, DATE_UNIX_TIMESTAMP);
2552
+ return moment$9(value, DATE_UNIX_TIMESTAMP);
2529
2553
  }
2530
2554
  else if (value.length === 13) {
2531
- return moment$1(value, DATE_UNIX_MS_TIMESTAMP);
2555
+ return moment$9(value, DATE_UNIX_MS_TIMESTAMP);
2532
2556
  }
2533
2557
  }
2534
2558
  console.warn('Unable to parse date: ' + value);
2535
2559
  return undefined;
2536
2560
  }
2537
2561
  function fromUnixTimestamp(timeInSec) {
2538
- return moment$1(timeInSec, DATE_UNIX_TIMESTAMP);
2562
+ return moment$9(timeInSec, DATE_UNIX_TIMESTAMP);
2539
2563
  }
2540
2564
  function fromUnixMsTimestamp(timeInMs) {
2541
- return moment$1(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2565
+ return moment$9(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2542
2566
  }
2543
2567
  function toDuration(value, unit) {
2544
2568
  if (!value)
2545
2569
  return undefined;
2546
- const duration = moment$1.duration(value, unit);
2570
+ const duration = moment$9.duration(value, unit);
2547
2571
  // fix 990+ ms
2548
2572
  if (duration.milliseconds() >= 990) {
2549
2573
  duration.add(1000 - duration.milliseconds(), 'ms');
@@ -2572,7 +2596,7 @@ class DurationPipe {
2572
2596
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + hour + ':' + minute;
2573
2597
  }
2574
2598
  }
2575
- DurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(ɵɵinject(TranslateService)); }, token: DurationPipe, providedIn: "root" });
2599
+ DurationPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(i0.ɵɵinject(i1$1.TranslateService)); }, token: DurationPipe, providedIn: "root" });
2576
2600
  DurationPipe.decorators = [
2577
2601
  { type: Pipe, args: [{
2578
2602
  name: 'duration'
@@ -2593,7 +2617,7 @@ class MathAbsPipe {
2593
2617
  }
2594
2618
  }
2595
2619
  }
2596
- MathAbsPipe.ɵprov = ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2620
+ MathAbsPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2597
2621
  MathAbsPipe.decorators = [
2598
2622
  { type: Pipe, args: [{
2599
2623
  name: 'mathAbs'
@@ -2605,7 +2629,7 @@ class EvenPipe {
2605
2629
  return val % 2 === 0;
2606
2630
  }
2607
2631
  }
2608
- EvenPipe.ɵprov = ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2632
+ EvenPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2609
2633
  EvenPipe.decorators = [
2610
2634
  { type: Pipe, args: [{
2611
2635
  name: 'even'
@@ -2617,7 +2641,7 @@ class OddPipe {
2617
2641
  return val % 2 !== 0;
2618
2642
  }
2619
2643
  }
2620
- OddPipe.ɵprov = ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2644
+ OddPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2621
2645
  OddPipe.decorators = [
2622
2646
  { type: Pipe, args: [{
2623
2647
  name: 'odd'
@@ -2725,7 +2749,7 @@ class MapGetPipe {
2725
2749
  return val[key];
2726
2750
  }
2727
2751
  }
2728
- MapGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2752
+ MapGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2729
2753
  MapGetPipe.decorators = [
2730
2754
  { type: Pipe, args: [{
2731
2755
  name: 'mapGet'
@@ -2739,7 +2763,7 @@ class MapKeysPipe {
2739
2763
  return Object.keys(map);
2740
2764
  }
2741
2765
  }
2742
- MapKeysPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2766
+ MapKeysPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2743
2767
  MapKeysPipe.decorators = [
2744
2768
  { type: Pipe, args: [{
2745
2769
  name: 'mapKeys'
@@ -2753,7 +2777,7 @@ class MapValuesPipe {
2753
2777
  return Object.values(map);
2754
2778
  }
2755
2779
  }
2756
- MapValuesPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2780
+ MapValuesPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2757
2781
  MapValuesPipe.decorators = [
2758
2782
  { type: Pipe, args: [{
2759
2783
  name: 'mapValues'
@@ -2881,7 +2905,7 @@ class TranslateContextService {
2881
2905
  return translations[keys[keys.length - 1]]; // Return the last keys translation
2882
2906
  }
2883
2907
  }
2884
- TranslateContextService.ɵprov = ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(ɵɵinject(TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2908
+ TranslateContextService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(i0.ɵɵinject(i1$1.TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2885
2909
  TranslateContextService.decorators = [
2886
2910
  { type: Injectable, args: [{ providedIn: 'root' },] }
2887
2911
  ];
@@ -2939,7 +2963,7 @@ NgInitDirective.propDecorators = {
2939
2963
  ngInit: [{ type: Output }]
2940
2964
  };
2941
2965
 
2942
- const moment$2 = momentImported;
2966
+ const moment$8 = momentImported;
2943
2967
  // @dynamic
2944
2968
  class SharedValidators {
2945
2969
  static getDoubleRegexp(maxDecimals) {
@@ -3020,7 +3044,7 @@ class SharedValidators {
3020
3044
  }
3021
3045
  static validDate(control) {
3022
3046
  const value = control.value;
3023
- const date = !value || moment$2.isMoment(value) ? value : moment$2(value, DATE_ISO_PATTERN);
3047
+ const date = !value || moment$8.isMoment(value) ? value : moment$8(value, DATE_ISO_PATTERN);
3024
3048
  if (date && (!date.isValid() || date.year() < 1970)) {
3025
3049
  return { validDate: true };
3026
3050
  }
@@ -4145,7 +4169,7 @@ class FormErrorTranslator {
4145
4169
  return errorKey;
4146
4170
  }
4147
4171
  }
4148
- FormErrorTranslator.ɵprov = ɵɵdefineInjectable({ factory: function FormErrorTranslator_Factory() { return new FormErrorTranslator(ɵɵinject(TranslateService), ɵɵinject(APP_FORM_ERROR_I18N_KEYS, 8)); }, token: FormErrorTranslator, providedIn: "root" });
4172
+ 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" });
4149
4173
  FormErrorTranslator.decorators = [
4150
4174
  { type: Injectable, args: [{ providedIn: 'root' },] }
4151
4175
  ];
@@ -4407,7 +4431,7 @@ class PropertyFormatPipe {
4407
4431
  return this._i18nNo;
4408
4432
  }
4409
4433
  }
4410
- PropertyFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function PropertyFormatPipe_Factory() { return new PropertyFormatPipe(ɵɵinject(DateFormatPipe), ɵɵinject(TranslateService)); }, token: PropertyFormatPipe, providedIn: "root" });
4434
+ PropertyFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PropertyFormatPipe_Factory() { return new PropertyFormatPipe(i0.ɵɵinject(DateFormatPipe), i0.ɵɵinject(i1$1.TranslateService)); }, token: PropertyFormatPipe, providedIn: "root" });
4411
4435
  PropertyFormatPipe.decorators = [
4412
4436
  { type: Pipe, args: [{
4413
4437
  name: 'propertyFormat'
@@ -4773,9 +4797,9 @@ function parseDuration(input, maxDecimals, placeholderChar) {
4773
4797
  const hour = parseInt(durationParts[0] || '0');
4774
4798
  const minute = parseInt(durationParts[1] || '0');
4775
4799
  const value = hour + (minute + 0.5) / 60;
4776
- return roundFloat$1(value, maxDecimals);
4800
+ return roundFloat(value, maxDecimals);
4777
4801
  }
4778
- function roundFloat$1(input, maxDecimals) {
4802
+ function roundFloat(input, maxDecimals) {
4779
4803
  if (maxDecimals > 0) {
4780
4804
  const powDecimal = Math.pow(10, maxDecimals);
4781
4805
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -4799,16 +4823,16 @@ const MASKS = {
4799
4823
  DD: [/[+-]/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '°']
4800
4824
  }
4801
4825
  };
4802
- const noop$1 = () => {
4826
+ const noop$7 = () => {
4803
4827
  };
4804
- const ɵ0$2 = noop$1;
4828
+ const ɵ0$a = noop$7;
4805
4829
  class MatLatLongField {
4806
4830
  constructor(formBuilder, cd, formGroupDir) {
4807
4831
  this.formBuilder = formBuilder;
4808
4832
  this.cd = cd;
4809
4833
  this.formGroupDir = formGroupDir;
4810
- this._onChangeCallback = noop$1;
4811
- this._onTouchedCallback = noop$1;
4834
+ this._onChangeCallback = noop$7;
4835
+ this._onTouchedCallback = noop$7;
4812
4836
  this._subscription = new Subscription();
4813
4837
  this._disabling = false;
4814
4838
  this._writing = false;
@@ -5153,14 +5177,14 @@ SharedMatLatLongModule.decorators = [
5153
5177
  },] }
5154
5178
  ];
5155
5179
 
5156
- const DEFAULT_VALUE_ACCESSOR = {
5180
+ const DEFAULT_VALUE_ACCESSOR$5 = {
5157
5181
  provide: NG_VALUE_ACCESSOR,
5158
5182
  useExisting: forwardRef(() => MatDate),
5159
5183
  multi: true
5160
5184
  };
5161
5185
  const TEXT_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5162
- const noop$2 = () => { };
5163
- const ɵ0$3 = noop$2;
5186
+ const noop$6 = () => { };
5187
+ const ɵ0$9 = noop$6;
5164
5188
  class MatDate {
5165
5189
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5166
5190
  this.dateAdapter = dateAdapter;
@@ -5169,8 +5193,8 @@ class MatDate {
5169
5193
  this.cd = cd;
5170
5194
  this.keyboard = keyboard;
5171
5195
  this.formGroupDir = formGroupDir;
5172
- this._onChangeCallback = noop$2;
5173
- this._onTouchedCallback = noop$2;
5196
+ this._onChangeCallback = noop$6;
5197
+ this._onTouchedCallback = noop$6;
5174
5198
  this._subscription = new Subscription();
5175
5199
  this._writing = true;
5176
5200
  this._disabling = false;
@@ -5476,7 +5500,7 @@ MatDate.decorators = [
5476
5500
  selector: 'mat-date-field',
5477
5501
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: datePattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: mask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"textControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\" [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"\n ></mat-datepicker>\n\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
5478
5502
  providers: [
5479
- DEFAULT_VALUE_ACCESSOR,
5503
+ DEFAULT_VALUE_ACCESSOR$5,
5480
5504
  ],
5481
5505
  changeDetection: ChangeDetectionStrategy.OnPush,
5482
5506
  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%}"]
@@ -5511,16 +5535,16 @@ MatDate.propDecorators = {
5511
5535
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5512
5536
  };
5513
5537
 
5514
- const DEFAULT_VALUE_ACCESSOR$1 = {
5538
+ const DEFAULT_VALUE_ACCESSOR$4 = {
5515
5539
  provide: NG_VALUE_ACCESSOR,
5516
5540
  useExisting: forwardRef(() => MatDateTime),
5517
5541
  multi: true
5518
5542
  };
5519
- const DAY_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5543
+ const DAY_MASK$1 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5520
5544
  const HOUR_REGEXP = /^[012][0-9][:][012345][0-9]$/;
5521
- const HOUR_MASK = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5522
- const noop$3 = () => { };
5523
- const ɵ0$4 = noop$3;
5545
+ const HOUR_MASK$1 = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5546
+ const noop$5 = () => { };
5547
+ const ɵ0$8 = noop$5;
5524
5548
  class MatDateTime {
5525
5549
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5526
5550
  this.dateAdapter = dateAdapter;
@@ -5529,14 +5553,14 @@ class MatDateTime {
5529
5553
  this.cd = cd;
5530
5554
  this.keyboard = keyboard;
5531
5555
  this.formGroupDir = formGroupDir;
5532
- this._onChangeCallback = noop$3;
5533
- this._onTouchedCallback = noop$3;
5556
+ this._onChangeCallback = noop$5;
5557
+ this._onTouchedCallback = noop$5;
5534
5558
  this._subscription = new Subscription();
5535
5559
  this._writing = true;
5536
5560
  this._disabling = false;
5537
5561
  this._readonly = false;
5538
- this.dayMask = DAY_MASK;
5539
- this.hourMask = HOUR_MASK;
5562
+ this.dayMask = DAY_MASK$1;
5563
+ this.hourMask = HOUR_MASK$1;
5540
5564
  this.floatLabel = 'auto';
5541
5565
  this.compact = false;
5542
5566
  this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
@@ -5857,7 +5881,7 @@ MatDateTime.decorators = [
5857
5881
  selector: 'mat-date-time-field',
5858
5882
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable + time -->\n<ng-template #writable >\n <ion-grid class=\"ion-no-padding mat-form-field-{{appearance}}\">\n <ion-row class=\"ion-no-padding no-wrap\" nowrap>\n\n <!-- day -->\n <ion-col class=\"day ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"></mat-datepicker>\n <div class=\"mat-form-field-subscript mat-form-field-subscript-wrapper\" >\n <!-- errors -->\n <ng-container [ngSwitch]=\"formControl.touched && formControl.errors|mapKeys|arrayFirst\">\n <mat-error *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</mat-error>\n </ng-container>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </div>\n\n </ion-col>\n\n <!-- hour -->\n <ion-col class=\"hour ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [class.mat-form-field-invalid]=\"formControl.touched && (hourControl.invalid || formControl.invalid)\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n <input matInput #matInput type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"hourControl\"\n autocomplete=\"off\"\n min=\"0\" max=\"23\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.TIME_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keyup.arrowdown)=\"openTimePicker($event)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n <input matInput #matInput type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"hourControl\"\n (click)=\"openTimePickerIfMobile($event)\"\n readonly>\n\n <input matInput type=\"text\"\n [formControl]=\"hourControl\"\n hidden\n [ngxTimepicker]=\"timePicker\"\n [format]=\"24\">\n\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && !mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePicker($event)\" >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePickerIfMobile($event)\">\n <mat-icon>access_time</mat-icon>\n </button>\n\n <ngx-material-timepicker #timePicker [@.disabled]=\"true\"\n (timeSet)=\"onTimePickerChange($event)\"\n [ESC]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"false\"\n [disableAnimation]=\"true\">\n <!-- cancel button -->\n <ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n </ng-template>\n\n <!-- confirm button -->\n <ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ng-template>\n\n </ngx-material-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
5859
5883
  providers: [
5860
- DEFAULT_VALUE_ACCESSOR$1,
5884
+ DEFAULT_VALUE_ACCESSOR$4,
5861
5885
  ],
5862
5886
  changeDetection: ChangeDetectionStrategy.OnPush,
5863
5887
  styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field .datetime-md{padding:0!important}ion-row.no-wrap{flex-wrap:nowrap}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field input[type=text],ion-col.hour mat-form-field mat-label{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.mat-form-field-outline ion-col.day{min-width:153px}.mat-form-field-outline ion-col.hour{min-width:100px;max-width:110px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}"]
@@ -5892,15 +5916,15 @@ MatDateTime.propDecorators = {
5892
5916
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5893
5917
  };
5894
5918
 
5895
- const DEFAULT_VALUE_ACCESSOR$2 = {
5919
+ const DEFAULT_VALUE_ACCESSOR$3 = {
5896
5920
  provide: NG_VALUE_ACCESSOR,
5897
5921
  useExisting: forwardRef(() => MatDateShort),
5898
5922
  multi: true
5899
5923
  };
5900
- const DAY_MASK$1 = [/\d/, /\d/, /\d/, /\d/];
5924
+ const DAY_MASK = [/\d/, /\d/, /\d/, /\d/];
5901
5925
  const noop$4 = () => {
5902
5926
  };
5903
- const ɵ0$5 = noop$4;
5927
+ const ɵ0$7 = noop$4;
5904
5928
  class MatDateShort {
5905
5929
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5906
5930
  this.dateAdapter = dateAdapter;
@@ -5913,7 +5937,7 @@ class MatDateShort {
5913
5937
  this._onTouchedCallback = noop$4;
5914
5938
  this.writing = true;
5915
5939
  this.disabling = false;
5916
- this.dayMask = DAY_MASK$1;
5940
+ this.dayMask = DAY_MASK;
5917
5941
  this.disabled = false;
5918
5942
  this.floatLabel = 'auto';
5919
5943
  this.readonly = false;
@@ -6158,7 +6182,7 @@ MatDateShort.decorators = [
6158
6182
  selector: 'mat-date-short-field',
6159
6183
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_YEAR_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker1)\"\n (keyup.escape)=\"preventEvent($event)\"\n (click)=\"matInput.select()\"\n [required]=\"required\"\n [tabindex]=\"tabindex\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker1)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final control -->\n <input matInput type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker1\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n (click)=\"openDatePicker($event, datePicker1)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"writeValue(null)\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\" [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <mat-datepicker #datePicker1\n startView=\"multi-year\"\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n (yearSelected)=\"closeDatePicker($event, datePicker1)\"\n [startAt]=\"startDate\"></mat-datepicker>\n\n <ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n </ng-template>\n\n <ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n </ng-template>\n\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
6160
6184
  providers: [
6161
- DEFAULT_VALUE_ACCESSOR$2,
6185
+ DEFAULT_VALUE_ACCESSOR$3,
6162
6186
  ],
6163
6187
  changeDetection: ChangeDetectionStrategy.OnPush,
6164
6188
  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%}"]
@@ -6227,16 +6251,16 @@ SharedMatDateTimeModule.decorators = [
6227
6251
  },] }
6228
6252
  ];
6229
6253
 
6230
- const DEFAULT_VALUE_ACCESSOR$3 = {
6254
+ const DEFAULT_VALUE_ACCESSOR$2 = {
6231
6255
  provide: NG_VALUE_ACCESSOR,
6232
6256
  useExisting: forwardRef(() => MatDuration),
6233
6257
  multi: true
6234
6258
  };
6235
6259
  const HOUR_TIME_PATTERN = /[0-9]\d\d:[0-5]\d/;
6236
- const HOUR_MASK$1 = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
6237
- const noop$5 = () => {
6260
+ const HOUR_MASK = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
6261
+ const noop$3 = () => {
6238
6262
  };
6239
- const ɵ0$6 = noop$5;
6263
+ const ɵ0$6 = noop$3;
6240
6264
  class MatDuration {
6241
6265
  constructor(platform, dateAdapter, translate, formBuilder, cd, formGroupDir) {
6242
6266
  this.dateAdapter = dateAdapter;
@@ -6245,11 +6269,11 @@ class MatDuration {
6245
6269
  this.cd = cd;
6246
6270
  this.formGroupDir = formGroupDir;
6247
6271
  this._subscription = new Subscription();
6248
- this._onChangeCallback = noop$5;
6249
- this._onTouchedCallback = noop$5;
6272
+ this._onChangeCallback = noop$3;
6273
+ this._onTouchedCallback = noop$3;
6250
6274
  this.writing = true;
6251
6275
  this.disabling = false;
6252
- this.hourMask = HOUR_MASK$1;
6276
+ this.hourMask = HOUR_MASK;
6253
6277
  this.disabled = false;
6254
6278
  this.floatLabel = 'auto';
6255
6279
  this.readonly = false;
@@ -6429,7 +6453,7 @@ MatDuration.decorators = [
6429
6453
  selector: 'mat-duration-field',
6430
6454
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{ formControl.value|duration }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [class.mat-form-field-disabled]=\"formControl.disabled\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput type=\"text\"\n autocomplete=\"off\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.DURATION_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keydown.tab)=\"moveCaretToSeparator($event, true)\"\n (keydown.shift.tab)=\"moveCaretToSeparator($event, false)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n\n <!-- errors -->\n <mat-error *ngIf=\"!formControl.hasError('required') && textControl.hasError('pattern')\" translate>ERROR.FIELD_NOT_VALID_PATTERN</mat-error>\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{(compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate:formControl.errors.min }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{(compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate:formControl.errors.max }}</mat-error>\n\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n</ng-template>\n\n",
6431
6455
  providers: [
6432
- DEFAULT_VALUE_ACCESSOR$3,
6456
+ DEFAULT_VALUE_ACCESSOR$2,
6433
6457
  ],
6434
6458
  changeDetection: ChangeDetectionStrategy.OnPush,
6435
6459
  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%}"]
@@ -6487,22 +6511,22 @@ SharedMatDurationModule.decorators = [
6487
6511
  },] }
6488
6512
  ];
6489
6513
 
6490
- const DEFAULT_VALUE_ACCESSOR$4 = {
6514
+ const DEFAULT_VALUE_ACCESSOR$1 = {
6491
6515
  provide: NG_VALUE_ACCESSOR,
6492
6516
  useExisting: forwardRef(() => MatBooleanField),
6493
6517
  multi: true
6494
6518
  };
6495
- const noop$6 = () => {
6519
+ const noop$2 = () => {
6496
6520
  };
6497
- const ɵ0$7 = noop$6;
6521
+ const ɵ0$5 = noop$2;
6498
6522
  class MatBooleanField {
6499
6523
  constructor(translate, formBuilder, cd, formGroupDir) {
6500
6524
  this.translate = translate;
6501
6525
  this.formBuilder = formBuilder;
6502
6526
  this.cd = cd;
6503
6527
  this.formGroupDir = formGroupDir;
6504
- this._onChangeCallback = noop$6;
6505
- this._onTouchedCallback = noop$6;
6528
+ this._onChangeCallback = noop$2;
6529
+ this._onTouchedCallback = noop$2;
6506
6530
  this._writing = false;
6507
6531
  this.showRadio = false;
6508
6532
  this.disabled = false;
@@ -6665,7 +6689,7 @@ MatBooleanField.decorators = [
6665
6689
  selector: 'mat-boolean-field',
6666
6690
  template: "<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{(value == null ? 'COMMON.EMPTY_OPTION' : (value === true ? yesLabel : noLabel)) | translate }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<ng-template #writable>\n <ng-container [ngSwitch]=\"style\">\n\n <!-- Radio -->\n <mat-form-field *ngSwitchCase=\"'radio'\"\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-radio {{classList}}\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n <span [hidden]=\"showRadio\">({{yesLabel|translate}}/{{'COMMON.NO'|translate}})</span>\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #fakeInput type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <!-- radio button -->\n <mat-radio-group [hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\">\n <mat-radio-button #yesButton [value]=\"true\">\n <span>{{yesLabel|translate}}</span>\n </mat-radio-button>&nbsp;\n <mat-radio-button #noButton [value]=\"false\">\n <span>{{noLabel|translate}}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Checkbox -->\n <mat-form-field *ngSwitchCase=\"'checkbox'\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{classList}}\">\n <mat-label *ngIf=\"placeholder && !showRadio\">\n {{placeholder}}\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #matInput\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <ion-label>&nbsp;</ion-label>\n\n <!-- checkbox, when compact -->\n <mat-checkbox #checkboxButton\n [formControl]=\"formControl\"\n (change)=\"onCheckboxValueChanged($event)\"\n [indeterminate]=\"value===null\"\n [hidden]=\"!showRadio\"\n [tabindex]=\"tabindex\">\n </mat-checkbox>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Buttons -->\n <mat-form-field *ngSwitchCase=\"'button'\"\n [floatLabel]=\"floatLabel === 'never' ? 'never' : 'always'\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-button {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput type=\"text\" hidden\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\">\n <div class=\"mat-form-field-buttons\"\n [style.--buttons-col-count]=\"buttonsColCount\"\n *ngIf=\"!formControl.disabled; else disabledLabel\">\n <!-- yes -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === true) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && yesIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{yesLabel|translate}}\n </ion-button>\n\n <!-- No button -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex !== undefined ? (_tabindex + 1) : undefined\"\n (click)=\"writeValue(false, $event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === false) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && noIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{noLabel|translate}}\n </ion-button>\n </div>\n <ng-template #disabledLabel>\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ng-template>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n </ng-container>\n\n</ng-template>\n\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
6667
6691
  providers: [
6668
- DEFAULT_VALUE_ACCESSOR$4
6692
+ DEFAULT_VALUE_ACCESSOR$1
6669
6693
  ],
6670
6694
  changeDetection: ChangeDetectionStrategy.OnPush,
6671
6695
  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}"]
@@ -6912,7 +6936,7 @@ class MatNumpadDomService {
6912
6936
  this.appRef.detachView(this.componentRef.hostView);
6913
6937
  }
6914
6938
  }
6915
- MatNumpadDomService.ɵprov = ɵɵdefineInjectable({ factory: function MatNumpadDomService_Factory() { return new MatNumpadDomService(ɵɵinject(ComponentFactoryResolver), ɵɵinject(ApplicationRef), ɵɵinject(INJECTOR), ɵɵinject(DOCUMENT, 8)); }, token: MatNumpadDomService, providedIn: "root" });
6939
+ 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" });
6916
6940
  MatNumpadDomService.decorators = [
6917
6941
  { type: Injectable, args: [{
6918
6942
  providedIn: 'root'
@@ -7276,7 +7300,7 @@ SharedMatNumpadModule.decorators = [
7276
7300
  },] }
7277
7301
  ];
7278
7302
 
7279
- const DEFAULT_VALUE_ACCESSOR$5 = {
7303
+ const DEFAULT_VALUE_ACCESSOR = {
7280
7304
  provide: NG_VALUE_ACCESSOR,
7281
7305
  useExisting: forwardRef(() => MatSwipeField),
7282
7306
  multi: true
@@ -7539,7 +7563,7 @@ MatSwipeField.decorators = [
7539
7563
  { type: Component, args: [{
7540
7564
  selector: 'mat-swipe-field',
7541
7565
  template: "<mat-form-field [floatLabel]=\"showSlides && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n [appearance]=\"appearance\"\n [class]=\"classList\"\n [class.mat-form-field-disabled]=\"disabled\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n </mat-label>\n <input matInput #fakeInput type=\"text\"\n [formControl]=\"formControl\"\n [readonly]=\"true\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showSlides\"\n [tabindex]=\"tabindex\">\n\n <div class=\"slides-container\" [class.hidden]=\"!showSlides\">\n <ion-slides #slides\n [options]=\"slidesOptions\"\n (ionSlidesDidLoad)=\"slidesLoaded()\"\n (ionSlideReachStart)=\"reachStart(true)\"\n (ionSlideReachEnd)=\"reachEnd(true)\"\n (ionSlideNextEnd)=\"reachStart(false)\"\n (ionSlidePrevEnd)=\"reachEnd(false)\"\n (ionSlideDidChange)=\"slideChanged()\"\n >\n <ion-slide *ngFor=\"let item of $items | async\">\n <ion-label>{{ displayWith(item) }}</ion-label>\n </ion-slide>\n\n </ion-slides>\n </div>\n\n <button #prevButton\n mat-icon-button\n type=\"button\"\n class=\"button-prev\"\n [hidden]=\"!showSlides\"\n [disabled]=\"previousDisabled\"\n (click)=\"previous()\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button #nextButton\n mat-icon-button\n type=\"button\"\n class=\"button-next\"\n [hidden]=\"!showSlides\"\n [disabled]=\"nextDisabled\"\n (click)=\"next()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n\n</mat-form-field>\n",
7542
- providers: [DEFAULT_VALUE_ACCESSOR$5],
7566
+ providers: [DEFAULT_VALUE_ACCESSOR],
7543
7567
  changeDetection: ChangeDetectionStrategy.OnPush,
7544
7568
  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}"]
7545
7569
  },] }
@@ -7598,14 +7622,14 @@ SharedMatSwipeModule.decorators = [
7598
7622
  },] }
7599
7623
  ];
7600
7624
 
7601
- const noop$7 = () => { };
7602
- const ɵ0$8 = noop$7;
7625
+ const noop$1 = () => { };
7626
+ const ɵ0$4 = noop$1;
7603
7627
  class MatChipsField {
7604
7628
  constructor(cd, formGroupDir) {
7605
7629
  this.cd = cd;
7606
7630
  this.formGroupDir = formGroupDir;
7607
- this._onChangeCallback = noop$7;
7608
- this._onTouchedCallback = noop$7;
7631
+ this._onChangeCallback = noop$1;
7632
+ this._onTouchedCallback = noop$1;
7609
7633
  this.logPrefix = '[mat-chips] ';
7610
7634
  this.formControlName = null;
7611
7635
  this.required = false;
@@ -8477,7 +8501,7 @@ class ProgressBarService {
8477
8501
  }
8478
8502
  }
8479
8503
  }
8480
- ProgressBarService.ɵprov = ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8504
+ ProgressBarService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8481
8505
  ProgressBarService.decorators = [
8482
8506
  { type: Injectable, args: [{ providedIn: 'root' },] }
8483
8507
  ];
@@ -8521,7 +8545,7 @@ class AppGestureConfig extends HammerGestureConfig {
8521
8545
  return mc;
8522
8546
  }
8523
8547
  }
8524
- AppGestureConfig.ɵprov = ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8548
+ AppGestureConfig.ɵprov = i0.ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8525
8549
  AppGestureConfig.decorators = [
8526
8550
  { type: Injectable, args: [{ providedIn: 'root' },] }
8527
8551
  ];
@@ -8762,7 +8786,7 @@ class MatPaginatorI18n extends MatPaginatorIntl {
8762
8786
  this.previousPageLabel = this.translate.instant('COMMON.PAGINATOR.PREVIOUS_PAGE');
8763
8787
  }
8764
8788
  }
8765
- MatPaginatorI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(ɵɵinject(TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8789
+ MatPaginatorI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8766
8790
  MatPaginatorI18n.decorators = [
8767
8791
  { type: Injectable, args: [{ providedIn: 'root' },] }
8768
8792
  ];
@@ -8852,17 +8876,17 @@ function getColorContrast(color, bw) {
8852
8876
  return rgbArrayToHex(rgb.map(v => 255 - v));
8853
8877
  }
8854
8878
 
8855
- const noop$8 = () => {
8879
+ const noop = () => {
8856
8880
  };
8857
- const ɵ0$9 = noop$8;
8881
+ const ɵ0$3 = noop;
8858
8882
  class AppFormField {
8859
8883
  constructor(translate, cd, injector, formGroupDir) {
8860
8884
  this.translate = translate;
8861
8885
  this.cd = cd;
8862
8886
  this.injector = injector;
8863
8887
  this.formGroupDir = formGroupDir;
8864
- this._onChangeCallback = noop$8;
8865
- this._onTouchedCallback = noop$8;
8888
+ this._onChangeCallback = noop;
8889
+ this._onTouchedCallback = noop;
8866
8890
  this.readonly = false;
8867
8891
  this.compact = false;
8868
8892
  this.floatLabel = 'auto';
@@ -9298,14 +9322,14 @@ class AudioProvider extends StartableService {
9298
9322
  });
9299
9323
  }
9300
9324
  }
9301
- 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" });
9325
+ 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" });
9302
9326
  AudioProvider.decorators = [
9303
9327
  { type: Injectable, args: [{ providedIn: 'root' },] }
9304
9328
  ];
9305
9329
  AudioProvider.ctorParameters = () => [
9306
9330
  { type: Platform },
9307
- { type: NativeAudio$1, decorators: [{ type: Optional }] },
9308
- { type: Vibration$1, decorators: [{ type: Optional }] },
9331
+ { type: NativeAudio, decorators: [{ type: Optional }] },
9332
+ { type: Vibration, decorators: [{ type: Optional }] },
9309
9333
  { type: AudioManagement, decorators: [{ type: Optional }] }
9310
9334
  ];
9311
9335
 
@@ -9390,7 +9414,7 @@ class Hotkeys {
9390
9414
  });
9391
9415
  }
9392
9416
  }
9393
- Hotkeys.ɵprov = ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(ɵɵinject(EventManager), ɵɵinject(MatDialog), ɵɵinject(DOCUMENT), ɵɵinject(ModalController), ɵɵinject(PopoverController)); }, token: Hotkeys, providedIn: "root" });
9417
+ Hotkeys.ɵprov = i0.ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(i0.ɵɵinject(i1$5.EventManager), i0.ɵɵinject(i2$1.MatDialog), i0.ɵɵinject(i1$3.DOCUMENT), i0.ɵɵinject(i1$4.ModalController), i0.ɵɵinject(i1$4.PopoverController)); }, token: Hotkeys, providedIn: "root" });
9394
9418
  Hotkeys.decorators = [
9395
9419
  { type: Injectable, args: [{
9396
9420
  providedIn: 'root'
@@ -9483,7 +9507,7 @@ class ImagesUtils {
9483
9507
  reader.readAsDataURL(file);
9484
9508
  // Resize image, if need
9485
9509
  if (opts) {
9486
- return $progress.pipe(mergeMap$1((event) => __awaiter(this, void 0, void 0, function* () {
9510
+ return $progress.pipe(mergeMap((event) => __awaiter(this, void 0, void 0, function* () {
9487
9511
  if (event instanceof FileResponse) {
9488
9512
  const body = yield ImagesUtils.resizeBase64(event.body, opts);
9489
9513
  return new FileResponse({ body });
@@ -9604,7 +9628,7 @@ class ImagesUtils {
9604
9628
  }
9605
9629
  }
9606
9630
 
9607
- const uuidv4 = uuidv4Imported;
9631
+ const uuidv4$1 = uuidv4Imported;
9608
9632
  class FileService {
9609
9633
  constructor(platform,
9610
9634
  //private transfer: FileTransfer,
@@ -9641,7 +9665,7 @@ class FileService {
9641
9665
  const lastSlashIndex = fileUrl.lastIndexOf('/');
9642
9666
  if (lastSlashIndex === -1)
9643
9667
  throw new Error('Invalid URL: ' + fileUrl);
9644
- const fileName = lastSlashIndex < (fileUrl.length - 1) && fileUrl.substring(lastSlashIndex + 1) || uuidv4();
9668
+ const fileName = lastSlashIndex < (fileUrl.length - 1) && fileUrl.substring(lastSlashIndex + 1) || uuidv4$1();
9645
9669
  // Download into the file system
9646
9670
  if (outputType === 'fileUrl' && this.canUseFileSystem) {
9647
9671
  console.warn(`WARN: [file] Downloading image {${fileUrl}} in local filesystem...`);
@@ -9697,7 +9721,7 @@ class FileService {
9697
9721
  this._started = true;
9698
9722
  }
9699
9723
  }
9700
- FileService.ɵprov = ɵɵdefineInjectable({ factory: function FileService_Factory() { return new FileService(ɵɵinject(Platform), ɵɵinject(HttpClient), ɵɵinject(ENVIRONMENT)); }, token: FileService, providedIn: "root" });
9724
+ 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" });
9701
9725
  FileService.decorators = [
9702
9726
  { type: Injectable, args: [{
9703
9727
  providedIn: 'root',
@@ -9863,7 +9887,7 @@ class Base58 {
9863
9887
  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
9864
9888
 
9865
9889
  const scrypt = require('scrypt-async');
9866
- const sha256 = require('hash.js/lib/hash/sha/256');
9890
+ const sha256$1 = require('hash.js/lib/hash/sha/256');
9867
9891
  const sha512 = require('hash.js/lib/hash/sha/512');
9868
9892
  const nacl = {
9869
9893
  sign,
@@ -9967,7 +9991,7 @@ class CryptoService {
9967
9991
  * Hash (using SHA256) a message
9968
9992
  */
9969
9993
  sha256(message) {
9970
- return sha256().update(message).digest('hex');
9994
+ return sha256$1().update(message).digest('hex');
9971
9995
  }
9972
9996
  /**
9973
9997
  * Hash (using SHA512) a message
@@ -9980,7 +10004,7 @@ class CryptoService {
9980
10004
  return nacl.util.encodeBase64(m);
9981
10005
  }
9982
10006
  }
9983
- CryptoService.ɵprov = ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
10007
+ CryptoService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
9984
10008
  CryptoService.decorators = [
9985
10009
  { type: Injectable, args: [{ providedIn: 'root' },] }
9986
10010
  ];
@@ -10742,7 +10766,7 @@ SelectPeerModal.propDecorators = {
10742
10766
  onRefresh: [{ type: Input }]
10743
10767
  };
10744
10768
 
10745
- const moment$3 = momentImported;
10769
+ const moment$7 = momentImported;
10746
10770
  const SETTINGS_STORAGE_KEY = 'settings';
10747
10771
  const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
10748
10772
  // fixme: this constant points to static environment
@@ -10791,7 +10815,7 @@ class LocalSettingsService extends StartableService {
10791
10815
  var _a;
10792
10816
  if (isNil((_a = this._data) === null || _a === void 0 ? void 0 : _a.mobile)) {
10793
10817
  console.warn("[settings] Accessing to property 'mobile' BEFORE service started! Please use ready()");
10794
- return isMobile(window);
10818
+ this._data.mobile = isMobile(window);
10795
10819
  }
10796
10820
  return this._data.mobile;
10797
10821
  }
@@ -10985,11 +11009,11 @@ class LocalSettingsService extends StartableService {
10985
11009
  if (!feature) {
10986
11010
  feature = {
10987
11011
  name: featureName.toLowerCase(),
10988
- lastSyncDate: moment$3().toISOString()
11012
+ lastSyncDate: moment$7().toISOString()
10989
11013
  };
10990
11014
  }
10991
11015
  else {
10992
- feature.lastSyncDate = moment$3().toISOString();
11016
+ feature.lastSyncDate = moment$7().toISOString();
10993
11017
  }
10994
11018
  this.saveOfflineFeature(feature);
10995
11019
  }
@@ -11150,7 +11174,7 @@ class LocalSettingsService extends StartableService {
11150
11174
  if (!page || !page.title || !page.path)
11151
11175
  throw Error('Missing required argument \'page\', \'page.path\' or \'page.title\'');
11152
11176
  // Set time
11153
- page.time = page.time || moment$3();
11177
+ page.time = page.time || moment$7();
11154
11178
  // Clean the title (remove <small> tags)
11155
11179
  if (!opts || opts.removeTitleSmallTag !== false) {
11156
11180
  const tagIndex = page.title.indexOf('</small>');
@@ -11166,7 +11190,7 @@ class LocalSettingsService extends StartableService {
11166
11190
  return page;
11167
11191
  }
11168
11192
  }
11169
- 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" });
11193
+ 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" });
11170
11194
  LocalSettingsService.decorators = [
11171
11195
  { type: Injectable, args: [{
11172
11196
  providedIn: 'root'
@@ -11883,7 +11907,7 @@ class NetworkService extends StartableService {
11883
11907
  });
11884
11908
  }
11885
11909
  }
11886
- 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" });
11910
+ 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" });
11887
11911
  NetworkService.decorators = [
11888
11912
  { type: Injectable, args: [{ providedIn: 'root' },] }
11889
11913
  ];
@@ -11894,11 +11918,11 @@ NetworkService.ctorParameters = () => [
11894
11918
  { type: CryptoService },
11895
11919
  { type: Storage },
11896
11920
  { type: LocalSettingsService },
11897
- { type: CacheService$1 },
11921
+ { type: CacheService },
11898
11922
  { type: HttpClient },
11899
11923
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
11900
- { type: Network$1, decorators: [{ type: Optional }] },
11901
- { type: SplashScreen$1, decorators: [{ type: Optional }] },
11924
+ { type: Network, decorators: [{ type: Optional }] },
11925
+ { type: SplashScreen, decorators: [{ type: Optional }] },
11902
11926
  { type: TranslateService, decorators: [{ type: Optional }] },
11903
11927
  { type: ToastController, decorators: [{ type: Optional }] }
11904
11928
  ];
@@ -12829,7 +12853,7 @@ class EntitiesStorage extends StartableService {
12829
12853
  }
12830
12854
  EntitiesStorage.TRASH_PREFIX = 'Trash#';
12831
12855
  EntitiesStorage.REMOTE_PREFIX = 'Remote#';
12832
- 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" });
12856
+ 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" });
12833
12857
  EntitiesStorage.decorators = [
12834
12858
  { type: Injectable, args: [{ providedIn: 'root' },] }
12835
12859
  ];
@@ -12966,10 +12990,10 @@ function referentialToString(obj, properties) {
12966
12990
  function referentialsToString(values, properties, separator) {
12967
12991
  return (values || []).map(v => referentialToString(v, properties)).join(separator || ', ');
12968
12992
  }
12969
- const ɵ0$a = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12993
+ const ɵ0$2 = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12970
12994
  const StatusList = Object.freeze([
12971
12995
  {
12972
- id: ɵ0$a,
12996
+ id: ɵ0$2,
12973
12997
  icon: 'checkmark',
12974
12998
  label: 'REFERENTIAL.STATUS_ENUM.ENABLE'
12975
12999
  },
@@ -13244,7 +13268,7 @@ function accountToString(data) {
13244
13268
  (data.lastName || '')) || '';
13245
13269
  }
13246
13270
 
13247
- const uuidv4$1 = uuidv4Imported;
13271
+ const uuidv4 = uuidv4Imported;
13248
13272
  const _global = typeof global !== 'undefined' ? global : (typeof window !== 'undefined' ? window : {});
13249
13273
  const NativeWebSocket = _global.WebSocket || _global.MozWebSocket;
13250
13274
  /**
@@ -13288,7 +13312,7 @@ function createTrackerLink(opts) {
13288
13312
  // Skip if not tracked
13289
13313
  if (!context || !context.tracked)
13290
13314
  return forward(operation);
13291
- const id = context.serializationKey || uuidv4$1();
13315
+ const id = context.serializationKey || uuidv4();
13292
13316
  console.debug(`[apollo-tracker-link] Watching tracked query {${operation.operationName}#${id}}`);
13293
13317
  // Clean context, before calling JSON.stringify (remove unused attributes)
13294
13318
  const cleanContext = Object.assign(Object.assign({}, context), { optimisticResponse: null, cache: null });
@@ -14028,7 +14052,7 @@ class GraphqlService extends StartableService {
14028
14052
  return undefined;
14029
14053
  }
14030
14054
  }
14031
- 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" });
14055
+ 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" });
14032
14056
  GraphqlService.decorators = [
14033
14057
  { type: Injectable, args: [{
14034
14058
  providedIn: 'root'
@@ -14045,7 +14069,7 @@ GraphqlService.ctorParameters = () => [
14045
14069
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_GRAPHQL_TYPE_POLICIES,] }] }
14046
14070
  ];
14047
14071
 
14048
- const sha256$1 = require('hash.js/lib/hash/sha/256');
14072
+ const sha256 = require('hash.js/lib/hash/sha/256');
14049
14073
  class BaseGraphqlServiceOptions {
14050
14074
  }
14051
14075
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
@@ -14196,8 +14220,8 @@ class BaseGraphqlService extends StartableService {
14196
14220
  }
14197
14221
  /* -- protected methods -- */
14198
14222
  computeMutableWatchQueryId(opts) {
14199
- const queryName = opts.queryName || sha256$1().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
14200
- const variablesKey = opts.variables && sha256$1().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
14223
+ const queryName = opts.queryName || sha256().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
14224
+ const variablesKey = opts.variables && sha256().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
14201
14225
  return [queryName, opts.arrayFieldName, variablesKey].join('|');
14202
14226
  }
14203
14227
  findMutableWatchQueries(opts) {
@@ -14267,7 +14291,7 @@ const DEFAULT_AVATAR_IMAGE = 'assets/img/person.png';
14267
14291
  /* ------------------------------------
14268
14292
  * GraphQL queries
14269
14293
  * ------------------------------------*/
14270
- const Fragments = {
14294
+ const Fragments$1 = {
14271
14295
  account: gql `
14272
14296
  fragment AccountFragment on AccountVO {
14273
14297
  id
@@ -14302,14 +14326,14 @@ const Fragments = {
14302
14326
  }`
14303
14327
  };
14304
14328
  // Load account query
14305
- const LoadQuery = gql `
14329
+ const LoadQuery$1 = gql `
14306
14330
  query Account {
14307
14331
  data: account {
14308
14332
  ...AccountFragment
14309
14333
  }
14310
14334
  }
14311
- ${Fragments.account}
14312
- ${Fragments.settings}
14335
+ ${Fragments$1.account}
14336
+ ${Fragments$1.settings}
14313
14337
  `;
14314
14338
  // Check email query
14315
14339
  const IsEmailExistsQuery = gql `
@@ -14324,21 +14348,21 @@ const AccountMutations = {
14324
14348
  ...AccountFragment
14325
14349
  }
14326
14350
  }
14327
- ${Fragments.account}
14328
- ${Fragments.settings}`,
14351
+ ${Fragments$1.account}
14352
+ ${Fragments$1.settings}`,
14329
14353
  create: gql `mutation CreateAccount($data:AccountVOInput){
14330
14354
  data: createAccount(account: $data){
14331
14355
  ...AccountFragment
14332
14356
  }
14333
14357
  }
14334
- ${Fragments.account}
14335
- ${Fragments.settings}`,
14358
+ ${Fragments$1.account}
14359
+ ${Fragments$1.settings}`,
14336
14360
  saveSettings: gql `mutation SaveSettings($data:UserSettingsVOInput){
14337
14361
  data: saveSettings(settings: $data){
14338
14362
  ...UserSettingsFragment
14339
14363
  }
14340
14364
  }
14341
- ${Fragments.settings}`
14365
+ ${Fragments$1.settings}`
14342
14366
  };
14343
14367
  // Sent confirmation email
14344
14368
  const SendConfirmEmailMutation = gql `
@@ -14849,7 +14873,7 @@ class AccountService extends BaseGraphqlService {
14849
14873
  // Load remotely
14850
14874
  else {
14851
14875
  const { data } = yield this.graphql.query({
14852
- query: LoadQuery,
14876
+ query: LoadQuery$1,
14853
14877
  error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
14854
14878
  fetchPolicy: opts && opts.fetchPolicy || 'no-cache' || undefined
14855
14879
  });
@@ -15372,7 +15396,7 @@ class AccountService extends BaseGraphqlService {
15372
15396
  return Toasts.show(this.toastController, this.translate, opts);
15373
15397
  }
15374
15398
  }
15375
- 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" });
15399
+ 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" });
15376
15400
  AccountService.decorators = [
15377
15401
  { type: Injectable, args: [{ providedIn: 'root', deps: [ENVIRONMENT] },] }
15378
15402
  ];
@@ -15640,7 +15664,7 @@ const CONFIGURATION_STORAGE_KEY = 'configuration';
15640
15664
  /* ------------------------------------
15641
15665
  * GraphQL queries
15642
15666
  * ------------------------------------*/
15643
- const Fragments$1 = {
15667
+ const Fragments = {
15644
15668
  config: gql `
15645
15669
  fragment ConfigFragment on ConfigurationVO {
15646
15670
  id
@@ -15667,13 +15691,13 @@ const Fragments$1 = {
15667
15691
  }
15668
15692
  `
15669
15693
  };
15670
- const LoadQuery$1 = gql `
15694
+ const LoadQuery = gql `
15671
15695
  query Configuration{
15672
15696
  data: configuration{
15673
15697
  ...ConfigFragment
15674
15698
  }
15675
15699
  }
15676
- ${Fragments$1.config}
15700
+ ${Fragments.config}
15677
15701
  `;
15678
15702
  // Save (create or update) account mutation
15679
15703
  const SaveMutation = gql `
@@ -15682,7 +15706,7 @@ const SaveMutation = gql `
15682
15706
  ...ConfigFragment
15683
15707
  }
15684
15708
  }
15685
- ${Fragments$1.config}
15709
+ ${Fragments.config}
15686
15710
  `;
15687
15711
  const ClearCache = gql `
15688
15712
  query ClearCache($name: String) {
@@ -15733,7 +15757,7 @@ class ConfigService extends BaseGraphqlService {
15733
15757
  return __awaiter(this, void 0, void 0, function* () {
15734
15758
  const now = Date.now();
15735
15759
  console.debug('[config] Loading Pod configuration...');
15736
- const query = opts && opts.query || LoadQuery$1;
15760
+ const query = opts && opts.query || LoadQuery;
15737
15761
  const variables = opts && opts.variables || undefined;
15738
15762
  const res = yield this.graphql.query({
15739
15763
  query,
@@ -15972,7 +15996,7 @@ class ConfigService extends BaseGraphqlService {
15972
15996
  });
15973
15997
  }
15974
15998
  }
15975
- 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" });
15999
+ 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" });
15976
16000
  ConfigService.decorators = [
15977
16001
  { type: Injectable, args: [{
15978
16002
  providedIn: 'root',
@@ -16218,7 +16242,7 @@ class UriUtils {
16218
16242
  }
16219
16243
  }
16220
16244
 
16221
- const moment$4 = momentImported;
16245
+ const moment$6 = momentImported;
16222
16246
  const AndroidOsEnvironment = Object.freeze({
16223
16247
  DIRECTORY_DOWNLOADS: 'Download',
16224
16248
  DIRECTORY_DOWNLOADS_OLD: 'Downloads',
@@ -16253,6 +16277,8 @@ class PlatformService extends StartableService {
16253
16277
  is(platformName) {
16254
16278
  switch (platformName) {
16255
16279
  case 'mobile':
16280
+ // Exclude Windows touch screens - see sumaris-app issues #323 and #346
16281
+ return isMobile(window);
16256
16282
  case 'mobileweb':
16257
16283
  // Exclude Windows touch screens - see sumaris-app issues #323 and #346
16258
16284
  return this.platform.is(platformName) && !isWindows(window);
@@ -16479,16 +16505,16 @@ class PlatformService extends StartableService {
16479
16505
  }
16480
16506
  // config moment lib
16481
16507
  try {
16482
- moment$4.locale(event.lang);
16508
+ moment$6.locale(event.lang);
16483
16509
  console.debug('[platform] Use locale {' + event.lang + '}');
16484
16510
  }
16485
16511
  // If error, fallback to en
16486
16512
  catch (err) {
16487
- moment$4.locale('en');
16513
+ moment$6.locale('en');
16488
16514
  console.warn('[platform] Unknown local for moment lib. Using default [en]');
16489
16515
  }
16490
16516
  // Config date adapter
16491
- this.dateAdapter.setLocale(moment$4.locale());
16517
+ this.dateAdapter.setLocale(moment$6.locale());
16492
16518
  }
16493
16519
  });
16494
16520
  this.settings.onChange.subscribe(data => {
@@ -16688,7 +16714,7 @@ class PlatformService extends StartableService {
16688
16714
  });
16689
16715
  }
16690
16716
  }
16691
- 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" });
16717
+ 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" });
16692
16718
  PlatformService.decorators = [
16693
16719
  { type: Injectable, args: [{ providedIn: 'root' },] }
16694
16720
  ];
@@ -16703,15 +16729,15 @@ PlatformService.ctorParameters = () => [
16703
16729
  { type: NetworkService },
16704
16730
  { type: AccountService },
16705
16731
  { type: ConfigService },
16706
- { type: CacheService$1 },
16732
+ { type: CacheService },
16707
16733
  { type: Storage },
16708
16734
  { type: AudioProvider },
16709
16735
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
16710
- { type: StatusBar$1, decorators: [{ type: Optional }] },
16736
+ { type: StatusBar, decorators: [{ type: Optional }] },
16711
16737
  { type: Keyboard, decorators: [{ type: Optional }] },
16712
- { type: SplashScreen$1, decorators: [{ type: Optional }] },
16713
- { type: InAppBrowser$1, decorators: [{ type: Optional }] },
16714
- { type: Downloader$1, decorators: [{ type: Optional }] }
16738
+ { type: SplashScreen, decorators: [{ type: Optional }] },
16739
+ { type: InAppBrowser, decorators: [{ type: Optional }] },
16740
+ { type: Downloader, decorators: [{ type: Optional }] }
16715
16741
  ];
16716
16742
 
16717
16743
  class AppHelpModal {
@@ -16776,7 +16802,7 @@ class MatStepperI18n extends MatStepperIntl {
16776
16802
  this.optionalLabel = this.translate.instant('COMMON.OPTIONAL');
16777
16803
  }
16778
16804
  }
16779
- MatStepperI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(ɵɵinject(TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16805
+ MatStepperI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16780
16806
  MatStepperI18n.decorators = [
16781
16807
  { type: Injectable, args: [{ providedIn: 'root' },] }
16782
16808
  ];
@@ -18179,28 +18205,30 @@ class InMemoryEntitiesService extends EntitiesService {
18179
18205
  }
18180
18206
  this.dirty = false;
18181
18207
  }
18182
- watchAll(offset, size, sortBy, sortDirection, filterData, options) {
18183
- offset = offset >= 0 ? offset : 0;
18184
- size = size >= 0 ? size : -1;
18185
- if (!this.data) {
18186
- console.warn('[memory-data-service] Waiting value to be set...');
18187
- }
18188
- return this._onChange
18189
- .pipe(filter(isNotNil), mergeMap(_ => waitFor(() => !this._saving)), mergeMap((_) => __awaiter(this, void 0, void 0, function* () {
18208
+ loadAll(offset, size, sortBy, sortDirection, filter, opts) {
18209
+ return __awaiter(this, void 0, void 0, function* () {
18210
+ offset = offset >= 0 ? offset : 0;
18211
+ size = size >= 0 ? size : -1;
18212
+ if (!this.data) {
18213
+ console.warn('[memory-data-service] Waiting value to be set...');
18214
+ yield firstNotNilPromise(this._onChange);
18215
+ }
18216
+ // Wait end of saving
18217
+ if (this._saving)
18218
+ yield waitFor(() => !this._saving);
18190
18219
  const excludedDataByFilter = [];
18191
18220
  let excludedDataByPagination;
18192
18221
  try {
18193
- if (isEmptyArray(this.data)) {
18222
+ if (!this.data.length) {
18194
18223
  return { data: [], total: 0 };
18195
18224
  }
18196
18225
  // Apply sort
18197
18226
  let data = this._sortFn(this.data || [], sortBy, sortDirection);
18198
18227
  if (this._onLoad) {
18199
- const promiseOrData = this._onLoad(data);
18200
- data = ((promiseOrData instanceof Promise)) ? yield promiseOrData : promiseOrData;
18228
+ data = yield this._onLoad(data);
18201
18229
  }
18202
18230
  // Apply filter (will update hiddenData)
18203
- data = this.filter(data, filterData, excludedDataByFilter);
18231
+ data = this.filter(data, filter, excludedDataByFilter);
18204
18232
  // Compute the total length
18205
18233
  const total = data.length;
18206
18234
  // If page size=0 (e.g. only need total)
@@ -18242,13 +18270,37 @@ class InMemoryEntitiesService extends EntitiesService {
18242
18270
  if (data === this.data) {
18243
18271
  data = data.slice();
18244
18272
  }
18245
- return { data, total };
18273
+ const res = { data, total };
18274
+ const nextOffset = (offset || 0) + size;
18275
+ if (nextOffset < total) {
18276
+ res.fetchMore = () => this.loadAll(nextOffset, size, sortBy, sortDirection, filter, opts)
18277
+ .then(res => {
18278
+ var _a;
18279
+ // Update hidden data (remove new fetched item)
18280
+ if ((_a = res.data) === null || _a === void 0 ? void 0 : _a.length) {
18281
+ this._hiddenData = this._hiddenData.filter(item => !res.data.includes(item));
18282
+ }
18283
+ return res;
18284
+ });
18285
+ }
18286
+ return res;
18246
18287
  }
18247
18288
  finally {
18248
18289
  // Remember hidden data
18249
- this._hiddenData = !excludedDataByPagination ? excludedDataByFilter : excludedDataByFilter.concat(...excludedDataByPagination);
18290
+ if (offset === 0) {
18291
+ this._hiddenData = !excludedDataByPagination ? excludedDataByFilter : excludedDataByFilter.concat(...excludedDataByPagination);
18292
+ }
18250
18293
  }
18251
- })));
18294
+ });
18295
+ }
18296
+ watchAll(offset, size, sortBy, sortDirection, filterData, options) {
18297
+ offset = offset >= 0 ? offset : 0;
18298
+ size = size >= 0 ? size : -1;
18299
+ if (!this.data) {
18300
+ console.warn('[memory-data-service] Waiting value to be set...');
18301
+ }
18302
+ return this._onChange
18303
+ .pipe(filter(isNotNil), mergeMap(_ => this.loadAll(offset, size, sortBy, sortDirection, filterData, options)));
18252
18304
  }
18253
18305
  saveAll(data, options) {
18254
18306
  return __awaiter(this, void 0, void 0, function* () {
@@ -18670,7 +18722,7 @@ function state2side(state) {
18670
18722
  return 1;
18671
18723
  }
18672
18724
  }
18673
- const ɵ0$b = (defaultStateSize) => [
18725
+ const ɵ0$1 = (defaultStateSize) => [
18674
18726
  Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
18675
18727
  Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
18676
18728
  Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
@@ -18678,7 +18730,7 @@ const ɵ0$b = (defaultStateSize) => [
18678
18730
  const SCALE_OPTIONS_DEFAULT = {
18679
18731
  startColor: rgbArrayMap.red,
18680
18732
  startStates: [0, 2, 3],
18681
- startStepsFn: ɵ0$b
18733
+ startStepsFn: ɵ0$1
18682
18734
  };
18683
18735
  /**
18684
18736
  * Internal function, that create a colors scale, using iteration
@@ -19485,7 +19537,7 @@ class UserSettingsValidatorService extends AppValidatorService {
19485
19537
  });
19486
19538
  }
19487
19539
  }
19488
- UserSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(ɵɵinject(FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
19540
+ UserSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
19489
19541
  UserSettingsValidatorService.decorators = [
19490
19542
  { type: Injectable, args: [{ providedIn: 'root' },] }
19491
19543
  ];
@@ -19529,7 +19581,7 @@ class AccountValidatorService extends AppValidatorService {
19529
19581
  return validatorFns.length ? Validators.compose(validatorFns) : validatorFns.length === 1 ? validatorFns[0] : undefined;
19530
19582
  }
19531
19583
  }
19532
- AccountValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
19584
+ AccountValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
19533
19585
  AccountValidatorService.decorators = [
19534
19586
  { type: Injectable, args: [{ providedIn: 'root' },] }
19535
19587
  ];
@@ -19823,7 +19875,7 @@ class MenuService {
19823
19875
  this._$opened.next(false);
19824
19876
  }
19825
19877
  }
19826
- MenuService.ɵprov = ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
19878
+ MenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
19827
19879
  MenuService.decorators = [
19828
19880
  { type: Injectable, args: [{
19829
19881
  providedIn: 'root'
@@ -20159,7 +20211,7 @@ class LocalSettingsValidatorService extends AppValidatorService {
20159
20211
  });
20160
20212
  }
20161
20213
  }
20162
- LocalSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(ɵɵinject(FormBuilder), ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
20214
+ LocalSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
20163
20215
  LocalSettingsValidatorService.decorators = [
20164
20216
  { type: Injectable, args: [{ providedIn: 'root' },] }
20165
20217
  ];
@@ -20778,7 +20830,7 @@ class IsOnFieldModePipe {
20778
20830
  return value === 'FIELD';
20779
20831
  }
20780
20832
  }
20781
- IsOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20833
+ IsOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20782
20834
  IsOnFieldModePipe.decorators = [
20783
20835
  { type: Pipe, args: [{
20784
20836
  name: 'isOnField'
@@ -20790,7 +20842,7 @@ class IsNotOnFieldModePipe {
20790
20842
  return value !== 'FIELD';
20791
20843
  }
20792
20844
  }
20793
- IsNotOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20845
+ IsNotOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20794
20846
  IsNotOnFieldModePipe.decorators = [
20795
20847
  { type: Pipe, args: [{
20796
20848
  name: 'isNotOnField'
@@ -20805,7 +20857,7 @@ class PersonToStringPipe {
20805
20857
  return PersonUtils.personToString(value);
20806
20858
  }
20807
20859
  }
20808
- PersonToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20860
+ PersonToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20809
20861
  PersonToStringPipe.decorators = [
20810
20862
  { type: Pipe, args: [{
20811
20863
  name: 'personToString'
@@ -21158,7 +21210,7 @@ class IsLoginAccountPipe {
21158
21210
  return value && value.pubkey && true;
21159
21211
  }
21160
21212
  }
21161
- IsLoginAccountPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
21213
+ IsLoginAccountPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
21162
21214
  IsLoginAccountPipe.decorators = [
21163
21215
  { type: Pipe, args: [{
21164
21216
  name: 'isLogin'
@@ -21170,7 +21222,7 @@ class AccountToStringPipe {
21170
21222
  return accountToString(value);
21171
21223
  }
21172
21224
  }
21173
- AccountToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
21225
+ AccountToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
21174
21226
  AccountToStringPipe.decorators = [
21175
21227
  { type: Pipe, args: [{
21176
21228
  name: 'accountToString'
@@ -21185,7 +21237,7 @@ class DepartmentToStringPipe {
21185
21237
  return departmentToString(value);
21186
21238
  }
21187
21239
  }
21188
- DepartmentToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
21240
+ DepartmentToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
21189
21241
  DepartmentToStringPipe.decorators = [
21190
21242
  { type: Pipe, args: [{
21191
21243
  name: 'departmentToString'
@@ -21820,7 +21872,7 @@ class AuthGuardService {
21820
21872
  }));
21821
21873
  }
21822
21874
  }
21823
- AuthGuardService.ɵprov = ɵɵdefineInjectable({ factory: function AuthGuardService_Factory() { return new AuthGuardService(ɵɵinject(AccountService), ɵɵinject(ModalController), ɵɵinject(Router), ɵɵinject(ENVIRONMENT)); }, token: AuthGuardService, providedIn: "root" });
21875
+ 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" });
21824
21876
  AuthGuardService.decorators = [
21825
21877
  { type: Injectable, args: [{ providedIn: 'root' },] }
21826
21878
  ];
@@ -22285,8 +22337,6 @@ class AppTableUtils {
22285
22337
  }
22286
22338
  }
22287
22339
 
22288
- class AppTableDataSourceOptions {
22289
- }
22290
22340
  // @dynamic
22291
22341
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
22292
22342
  class EntitiesTableDataSource extends TableDataSource {
@@ -22299,30 +22349,22 @@ class EntitiesTableDataSource extends TableDataSource {
22299
22349
  * @param validatorService Service that create instances of the FormGroup used to validate row fields.
22300
22350
  * @param config Additional configuration for table.
22301
22351
  */
22302
- constructor(dataType, dataService, validatorService, config) {
22303
- super([], dataType, validatorService, config);
22352
+ constructor(dataType, dataService, validatorService, options) {
22353
+ super([], dataType, validatorService, Object.assign({ dataServiceOptions: {}, debug: (options === null || options === void 0 ? void 0 : options.suppressErrors) === false, keepOriginalDataAfterConfirm: false }, options));
22304
22354
  this.dataService = dataService;
22305
22355
  this._creating = false;
22306
22356
  this._saving = false;
22307
- this._useValidator = false;
22308
22357
  this._stopWatching$ = new Subject();
22309
22358
  this._editingRowCount = 0;
22310
22359
  this._fetchMoreFn = null;
22311
22360
  this.loadingSubject = new BehaviorSubject(undefined);
22312
- this._options = Object.assign({ dataServiceOptions: {}, debug: config && config.suppressErrors === false, keepOriginalDataAfterConfirm: false }, config);
22313
- this._useValidator = isNotNil(validatorService);
22314
- this._logTypeName = removeEnd((new dataType()).__typename || 'UnknownVO', 'VO');
22315
- // For DEV ONLY
22316
- this._debug = this._options.debug === true;
22361
+ this._entityName = removeEnd((new dataType()).__typename || 'UnknownVO', 'VO');
22317
22362
  }
22318
22363
  get serviceOptions() {
22319
- return this._options.dataServiceOptions;
22364
+ return this.config.dataServiceOptions;
22320
22365
  }
22321
22366
  set serviceOptions(value) {
22322
- this._options.dataServiceOptions = value;
22323
- }
22324
- get options() {
22325
- return this._options;
22367
+ this.config.dataServiceOptions = value;
22326
22368
  }
22327
22369
  get loaded() {
22328
22370
  return this.loadingSubject.value === false; // Should be false when undefined (initial state)
@@ -22345,10 +22387,10 @@ class EntitiesTableDataSource extends TableDataSource {
22345
22387
  return this.dataService.watchAll(offset, size, sortBy, sortDirection, filter, this.serviceOptions)
22346
22388
  .pipe(catchError(err => this.handleError(err, 'ERROR.LOAD_DATA_ERROR')), map((res) => {
22347
22389
  if (this._saving) {
22348
- console.info(`[table-datasource] Received ${this._logTypeName} data (from service), but still saving: skip`);
22390
+ console.info(`[table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);
22349
22391
  }
22350
22392
  else if (this._editingRowCount > 0) {
22351
- console.warn(`[table-datasource] Received ${this._logTypeName} data, while ${this._editingRowCount} rows still editing: skip; Please check save() implementation in the table!`);
22393
+ console.warn(`[table-datasource] Received ${this._entityName} data, while ${this._editingRowCount} rows still editing: skip; Please check save() implementation in the table!`);
22352
22394
  }
22353
22395
  else {
22354
22396
  this.updateDatasource((res.data || []));
@@ -22361,6 +22403,18 @@ class EntitiesTableDataSource extends TableDataSource {
22361
22403
  // ⚠ Notice: Don't put any operator after takeUntil to avoid potential subscription leaks
22362
22404
  );
22363
22405
  }
22406
+ updateDatasourceFromRows(rows) {
22407
+ var _a;
22408
+ // Avoid to update dataSourceSubject, when not need
22409
+ if ((_a = this.datasourceSubject.observers) === null || _a === void 0 ? void 0 : _a.length) {
22410
+ if (!this.config.suppressErrors)
22411
+ console.warn('[table-datasource] Update datasource subject. Please prefer using \'rowsSubject\' instead of \'datasourceSubject\'');
22412
+ super.updateDatasourceFromRows(rows);
22413
+ }
22414
+ else {
22415
+ console.debug('[table-datasource] Skipping datasourceSubject update (not used yet).');
22416
+ }
22417
+ }
22364
22418
  save() {
22365
22419
  return __awaiter(this, void 0, void 0, function* () {
22366
22420
  if (toBoolean(this.serviceOptions.readOnly, false)) {
@@ -22369,31 +22423,31 @@ class EntitiesTableDataSource extends TableDataSource {
22369
22423
  }
22370
22424
  // Saving twice (should never occur)
22371
22425
  if (this._saving) {
22372
- console.warn(`[table-datasource] Trying to save ${this._logTypeName} rows twice. Skip`);
22426
+ console.warn(`[table-datasource] Trying to save ${this._entityName} rows twice. Skip`);
22373
22427
  return false;
22374
22428
  }
22375
22429
  this._saving = true;
22376
22430
  this.markAsLoading();
22377
22431
  const onlyDirtyRows = toBoolean(this.serviceOptions.saveOnlyDirtyRows, false);
22378
22432
  try {
22379
- if (this._debug)
22380
- console.debug(`[table-datasource] Saving ${this._logTypeName} rows... {onlyDirty: ${onlyDirtyRows}}`);
22433
+ if (this.config.debug)
22434
+ console.debug(`[table-datasource] Saving ${this._entityName} rows... {onlyDirty: ${onlyDirtyRows}}`);
22381
22435
  // Get all rows
22382
- const rows = yield this.getRows();
22436
+ const rows = this.getRows();
22383
22437
  // Finish editing all rows
22384
22438
  const invalidRows = rows.filter(row => row.editing && !row.confirmEditCreate());
22385
22439
  // Cannot finish some rows: error
22386
22440
  if (invalidRows.length) {
22387
22441
  // log errors
22388
- if (this._debug)
22389
- invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._logTypeName} row #${row.id}`));
22442
+ if (this.config.debug)
22443
+ invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._entityName} row #${row.id}`));
22390
22444
  // Stop with an error
22391
22445
  throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
22392
22446
  }
22393
22447
  this._editingRowCount = 0;
22394
22448
  let data;
22395
22449
  let dataToSave;
22396
- if (this._useValidator) {
22450
+ if (this.validatorService) {
22397
22451
  dataToSave = [];
22398
22452
  data = rows.map(row => {
22399
22453
  const currentData = new this.dataConstructor();
@@ -22414,21 +22468,21 @@ class EntitiesTableDataSource extends TableDataSource {
22414
22468
  }
22415
22469
  // If no data to save: exit
22416
22470
  if (onlyDirtyRows && !dataToSave.length) {
22417
- if (this._debug)
22418
- console.debug(`[table-datasource] No ${this._logTypeName} data to save. Skip`);
22471
+ if (this.config.debug)
22472
+ console.debug(`[table-datasource] No ${this._entityName} data to save. Skip`);
22419
22473
  return false;
22420
22474
  }
22421
- if (this._debug)
22422
- console.debug(`[table-datasource] Asking service to save this ${this._logTypeName} data:`, dataToSave);
22475
+ if (this.config.debug)
22476
+ console.debug(`[table-datasource] Asking service to save this ${this._entityName} data:`, dataToSave);
22423
22477
  yield this.dataService.saveAll(dataToSave, this.serviceOptions);
22424
- if (this._debug)
22425
- console.debug(`[table-datasource] Saving ${this._logTypeName} data [OK]`);
22478
+ if (this.config.debug)
22479
+ console.debug(`[table-datasource] Saving ${this._entityName} data [OK]`);
22426
22480
  // LP 23/03/2021: update datasource is necessary but can be changed to a refetch() on QueryRef (must be created and registered in GraphqlService.watchQuery)
22427
22481
  this.updateDatasource(data, { emitEvent: false });
22428
22482
  return true;
22429
22483
  }
22430
22484
  catch (error) {
22431
- if (this._debug)
22485
+ if (this.config.debug)
22432
22486
  console.error('[table-datasource] Error while saving: ' + error && error.message || error);
22433
22487
  throw error;
22434
22488
  }
@@ -22439,17 +22493,13 @@ class EntitiesTableDataSource extends TableDataSource {
22439
22493
  });
22440
22494
  }
22441
22495
  updateDatasource(data, opts) {
22442
- if (this._debug)
22496
+ if (this.config.debug)
22443
22497
  console.debug(`[table-datasource] Updating datasource with data:`, data);
22444
22498
  super.updateDatasource(data, opts);
22445
22499
  if (!opts || opts.emitEvent !== false) {
22446
22500
  this.markAsLoaded();
22447
22501
  }
22448
22502
  }
22449
- // Overwrite default signature
22450
- createNew(insertAt) {
22451
- this.asyncCreateNew(insertAt);
22452
- }
22453
22503
  connect(collectionViewer) {
22454
22504
  // DEBUG console.debug("[entities-datasource] connect");
22455
22505
  return super.connect(collectionViewer);
@@ -22471,38 +22521,37 @@ class EntitiesTableDataSource extends TableDataSource {
22471
22521
  console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
22472
22522
  row.validator.disable({ onlySelf: true, emitEvent: false });
22473
22523
  }
22524
+ this._editingRowCount--;
22474
22525
  return true;
22475
22526
  }
22476
22527
  confirmEdit(row) {
22477
22528
  if (!super.confirmEdit(row))
22478
22529
  return false;
22479
22530
  if (row.editing && row.validator) {
22480
- console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
22531
+ console.warn('[table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');
22481
22532
  row.validator.disable({ onlySelf: true, emitEvent: false });
22482
22533
  }
22534
+ this._editingRowCount--;
22483
22535
  return true;
22484
22536
  }
22485
22537
  startEdit(row) {
22486
- if (this._debug)
22487
- console.debug('[table-datasource] Start to edit row', row);
22488
- row.startEdit();
22538
+ if (!super.startEdit(row))
22539
+ return false;
22540
+ if (!row.editing && row.validator) {
22541
+ console.warn('[table-datasource] Row still has {editing: false} after startEdit()! Force editing');
22542
+ row.validator.enable({ onlySelf: true, emitEvent: false });
22543
+ }
22489
22544
  this._editingRowCount++;
22490
22545
  }
22491
- cancelOrDelete(row) {
22492
- if (this._debug)
22493
- console.debug('[table-datasource] Cancelling or deleting row', row);
22494
- row.cancelOrDelete();
22495
- this._editingRowCount--;
22496
- }
22497
22546
  handleError(error, message) {
22498
22547
  const errorMsg = error && error.message || error;
22499
- console.error(`[table-datasource] Service ${this._logTypeName} sent error: ${errorMsg}`, error);
22548
+ console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
22500
22549
  this.markAsLoaded();
22501
22550
  throw new Error(message || errorMsg);
22502
22551
  }
22503
- handleErrorPromise(error) {
22552
+ handleServiceError(error) {
22504
22553
  const errorMsg = error && error.message || error;
22505
- console.error(`[table-datasource] Service ${this._logTypeName} sent error: ${errorMsg}`, error);
22554
+ console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
22506
22555
  this.markAsLoaded();
22507
22556
  throw error;
22508
22557
  }
@@ -22516,9 +22565,11 @@ class EntitiesTableDataSource extends TableDataSource {
22516
22565
  console.error(`[table-datasource] Row to delete with id=${id} not found`);
22517
22566
  return;
22518
22567
  }
22568
+ if (row.editing)
22569
+ this._editingRowCount--;
22519
22570
  this.loadingSubject.next(true);
22520
22571
  this.dataService.deleteAll([row.currentData], this.serviceOptions)
22521
- .catch(err => this.handleErrorPromise(err))
22572
+ .catch(err => this.handleServiceError(err))
22522
22573
  .then(() => {
22523
22574
  setTimeout(() => {
22524
22575
  // make sure row has been deleted (because GrapQHl cache remove can failed)
@@ -22530,66 +22581,77 @@ class EntitiesTableDataSource extends TableDataSource {
22530
22581
  });
22531
22582
  }
22532
22583
  deleteAll(rows) {
22533
- this.markAsLoading();
22534
- const data = rows.map(r => r.currentData);
22535
- const rowsById = rows.reduce((res, row) => {
22536
- res[row.id] = row;
22537
- return res;
22538
- }, {});
22539
- const self = this;
22540
- const selfDelete = super.delete;
22541
- return this.dataService.deleteAll(data, this.serviceOptions)
22542
- .catch(err => this.handleErrorPromise(err))
22543
- .then(() => {
22544
- // Workaround, to be sure all rows has been deleted
22545
- // Sometimes, the service miss deletion, or GrapQHl cache remove failed
22546
- const rowNotDeleted = Object.getOwnPropertyNames(rowsById).reduce((res, id) => {
22547
- const row = rowsById[id];
22548
- const present = self.getRow(+id) === row;
22549
- return present ? res.concat(row) : res;
22550
- }, []).sort((a, b) => a.id > b.id ? -1 : 1);
22551
- // Apply missing deletion
22552
- if (isNotEmptyArray(rowNotDeleted)) {
22553
- console.warn(`[table-datasource] Force deletion of ${rowNotDeleted.length} rows (Is service applying deletion to observable ?)`);
22554
- rowNotDeleted.forEach(r => selfDelete.call(self, r.id));
22584
+ const _super = Object.create(null, {
22585
+ delete: { get: () => super.delete }
22586
+ });
22587
+ return __awaiter(this, void 0, void 0, function* () {
22588
+ this.markAsLoading();
22589
+ const data = this.getDataFromRows(rows);
22590
+ const rowsById = Beans.collectById(rows);
22591
+ try {
22592
+ // Call service deletion
22593
+ yield this.dataService.deleteAll(data, this.serviceOptions);
22594
+ // Workaround, to be sure all rows have been deleted
22595
+ // Sometimes, the service miss deletion, or GrapQHl cache remove failed
22596
+ const rowNotDeleted = this.getRows().map(row => rows.find(r => r === row));
22597
+ // Apply missing deletion
22598
+ if (isNotEmptyArray(rowNotDeleted)) {
22599
+ console.warn(`[table-datasource] Force deletion of ${rowNotDeleted.length} rows (Is service update the cache ?)`);
22600
+ rowNotDeleted
22601
+ // Start from the end
22602
+ .sort((a, b) => a.id > b.id ? -1 : 1)
22603
+ .forEach(r => _super.delete.call(this, r.id));
22604
+ }
22605
+ }
22606
+ catch (err) {
22607
+ // Handle sservice error
22608
+ this.handleServiceError(err);
22609
+ }
22610
+ finally {
22611
+ this.loadingSubject.next(false);
22555
22612
  }
22556
- this.loadingSubject.next(false);
22557
22613
  });
22558
22614
  }
22615
+ getRow(id) {
22616
+ return super.getRow(id);
22617
+ }
22559
22618
  getRows() {
22560
- return firstNotNilPromise(this.connect(null));
22619
+ return this.rowsSubject.getValue();
22561
22620
  }
22562
- asyncCreateNew(insertAt) {
22621
+ createNew(insertAt, options = { editing: true }) {
22563
22622
  const _super = Object.create(null, {
22564
22623
  createNew: { get: () => super.createNew }
22565
22624
  });
22625
+ var _a;
22566
22626
  return __awaiter(this, void 0, void 0, function* () {
22567
22627
  if (this._creating)
22568
22628
  return; // Avoid multiple call (should never occur)
22569
22629
  this._creating = true;
22570
- _super.createNew.call(this, insertAt);
22571
- const row = this.getRow(-1);
22572
- if (row && this._options && this._options.onRowCreated) {
22573
- const res = this._options.onRowCreated(row);
22574
- // If async function, wait the end before ending
22575
- if (res instanceof Promise) {
22630
+ try {
22631
+ const row = yield _super.createNew.call(this, insertAt, options);
22632
+ if (!row)
22633
+ return;
22634
+ if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.onRowCreated) {
22576
22635
  try {
22577
- yield res;
22636
+ yield this.config.onRowCreated(row);
22578
22637
  }
22579
22638
  catch (err) {
22639
+ // Log, then continue
22580
22640
  console.error(err && err.message || err, err);
22581
22641
  }
22582
22642
  }
22643
+ if (row.editing)
22644
+ this._editingRowCount++;
22645
+ return row;
22646
+ }
22647
+ finally {
22648
+ this._creating = false;
22583
22649
  }
22584
- this._editingRowCount++;
22585
- this._creating = false;
22586
22650
  });
22587
22651
  }
22588
22652
  getData() {
22589
- return __awaiter(this, void 0, void 0, function* () {
22590
- const rows = yield this.getRows();
22591
- return this.getDataFromRows(rows);
22592
- });
22653
+ const rows = this.getRows();
22654
+ return this.getDataFromRows(rows);
22593
22655
  }
22594
22656
  fetchMore(opts) {
22595
22657
  const _super = Object.create(null, {
@@ -22599,20 +22661,20 @@ class EntitiesTableDataSource extends TableDataSource {
22599
22661
  if (!this._fetchMoreFn)
22600
22662
  return false; // Avoid multiple call
22601
22663
  if (this._editingRowCount > 0) {
22602
- console.warn('Cannot fetch more because still editing row');
22664
+ console.warn(`Cannot fetch more ${this._entityName} because ${this._editingRowCount} row(s) still editing`);
22603
22665
  return;
22604
22666
  }
22667
+ console.debug(`Will fetching more row(s) still...`);
22605
22668
  // Forget the fetchMore function, to avoid multiple call
22606
22669
  const fetchMoreFn = this._fetchMoreFn;
22607
22670
  this._fetchMoreFn = null;
22608
22671
  // Fetch next page
22609
22672
  const res = yield fetchMoreFn();
22610
22673
  // Skip if empty (no more data)
22611
- if (isNotEmptyArray(res === null || res === void 0 ? void 0 : res.data))
22674
+ if (isEmptyArray(res === null || res === void 0 ? void 0 : res.data))
22612
22675
  return false;
22613
22676
  // Update the data source
22614
- const existingData = yield this.getData();
22615
- _super.updateDatasource.call(this, existingData.concat(...res.data), opts);
22677
+ _super.updateDatasource.call(this, (this.currentData || []).concat(...res.data), opts);
22616
22678
  // Remember fetchMore
22617
22679
  this._fetchMoreFn = res.fetchMore;
22618
22680
  return true;
@@ -22636,8 +22698,8 @@ EntitiesTableDataSource.decorators = [
22636
22698
  EntitiesTableDataSource.ctorParameters = () => [
22637
22699
  { type: Function },
22638
22700
  { type: undefined },
22639
- { type: ValidatorService },
22640
- { type: AppTableDataSourceOptions }
22701
+ { type: undefined },
22702
+ { type: undefined }
22641
22703
  ];
22642
22704
 
22643
22705
  const SETTINGS_DISPLAY_COLUMNS = 'displayColumns';
@@ -23172,7 +23234,7 @@ class AppTable {
23172
23234
  if (id < 0)
23173
23235
  return;
23174
23236
  if (id >= this.visibleRowCount) {
23175
- this.addRow(event, undefined, opts);
23237
+ this.addRow(event, undefined, Object.assign(Object.assign({}, opts), { editing: true }));
23176
23238
  }
23177
23239
  else {
23178
23240
  const row = yield this.dataSource.getRow(id);
@@ -23925,15 +23987,19 @@ class AppTable {
23925
23987
  return __awaiter(this, void 0, void 0, function* () {
23926
23988
  this.focusFirstColumn = true;
23927
23989
  this.focusColumn = (opts === null || opts === void 0 ? void 0 : opts.focusColumn) || this.firstUserColumn;
23928
- yield this._dataSource.asyncCreateNew(insertAt);
23929
- this.editedRow = this._dataSource.getRow(-1);
23990
+ const row = yield this._dataSource.createNew(insertAt, Object.assign({ editing: true }, opts));
23991
+ if (!row)
23992
+ return undefined;
23930
23993
  // Emit start editing event
23931
- this.onStartEditingRow.emit(this.editedRow);
23994
+ if (row.editing) {
23995
+ this.editedRow = row;
23996
+ this.onStartEditingRow.emit(this.editedRow);
23997
+ }
23932
23998
  this.totalRowCount++;
23933
23999
  this.visibleRowCount++;
23934
24000
  this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });
23935
24001
  this.markForCheck();
23936
- return this.editedRow;
24002
+ return row;
23937
24003
  });
23938
24004
  }
23939
24005
  registerCellValueChanges(name, formPath, emitInitialValue) {
@@ -24108,7 +24174,7 @@ class AppTable {
24108
24174
  var _a, _b;
24109
24175
  return __awaiter(this, void 0, void 0, function* () {
24110
24176
  // Mark row as pristine
24111
- const markRowAsPristine = ((_a = this.dataSource) === null || _a === void 0 ? void 0 : _a.options.keepOriginalDataAfterConfirm) === true;
24177
+ const markRowAsPristine = ((_a = this.dataSource) === null || _a === void 0 ? void 0 : _a.config.restoreOriginalDataOnCancel) === true;
24112
24178
  if (markRowAsPristine) {
24113
24179
  (_b = row.validator) === null || _b === void 0 ? void 0 : _b.markAsPristine();
24114
24180
  // Check if table is now pristine
@@ -24122,7 +24188,7 @@ class AppTable {
24122
24188
  return __awaiter(this, void 0, void 0, function* () {
24123
24189
  if (!this.dirty)
24124
24190
  return; // Already pristine
24125
- const rows = yield this._dataSource.getRows();
24191
+ const rows = this._dataSource.getRows();
24126
24192
  const pristine = (rows || []).findIndex(row => { var _a; return (_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty; }) === -1;
24127
24193
  if (pristine)
24128
24194
  this.markAsPristine(opts);
@@ -26000,7 +26066,7 @@ AppInMemoryTable.ctorParameters = () => [
26000
26066
  { type: Function },
26001
26067
  { type: InMemoryEntitiesService },
26002
26068
  { type: ValidatorService },
26003
- { type: AppTableDataSourceOptions },
26069
+ { type: undefined },
26004
26070
  { type: undefined }
26005
26071
  ];
26006
26072
  AppInMemoryTable.propDecorators = {
@@ -26017,7 +26083,7 @@ const SocialErrorCodes = {
26017
26083
  SUBSCRIBE_JOB_PROGRESSION_ERROR: 50010
26018
26084
  };
26019
26085
 
26020
- const moment$6 = momentImported;
26086
+ const moment$4 = momentImported;
26021
26087
  const USER_EVENT_SERVICE = new InjectionToken('UserEventService');
26022
26088
  class AbstractUserEventService extends BaseGraphqlService {
26023
26089
  constructor(graphql, accountService, network, translate, options) {
@@ -26383,7 +26449,7 @@ class AbstractUserEventService extends BaseGraphqlService {
26383
26449
  }
26384
26450
  resetCount() {
26385
26451
  this._countSubject.next(undefined);
26386
- this.resetCountDate = moment$6();
26452
+ this.resetCountDate = moment$4();
26387
26453
  // restart listening count changes
26388
26454
  this.startListenCountChanges();
26389
26455
  }
@@ -26443,7 +26509,7 @@ class AbstractUserEventService extends BaseGraphqlService {
26443
26509
  if (!userEvents.length)
26444
26510
  return;
26445
26511
  // set read date
26446
- userEvents.forEach(userEvent => userEvent.readDate = moment$6());
26512
+ userEvents.forEach(userEvent => userEvent.readDate = moment$4());
26447
26513
  // split local/remote entities
26448
26514
  const localEntities = userEvents.filter(userEvent => !userEvent.id || userEvent.id < 0);
26449
26515
  const remoteEntities = userEvents.filter(userEvent => userEvent.id > 0);
@@ -27418,7 +27484,7 @@ class MessageService extends BaseGraphqlService {
27418
27484
  });
27419
27485
  }
27420
27486
  }
27421
- MessageService.ɵprov = ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(ɵɵinject(GraphqlService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT, 8)); }, token: MessageService, providedIn: "root" });
27487
+ MessageService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(i0.ɵɵinject(GraphqlService), i0.ɵɵinject(i1$1.TranslateService), i0.ɵɵinject(i1$4.ToastController), i0.ɵɵinject(ENVIRONMENT, 8)); }, token: MessageService, providedIn: "root" });
27422
27488
  MessageService.decorators = [
27423
27489
  { type: Injectable, args: [{ providedIn: 'root' },] }
27424
27490
  ];
@@ -27627,7 +27693,7 @@ class PersonService extends BaseEntityService {
27627
27693
  return target;
27628
27694
  }
27629
27695
  }
27630
- PersonService.ɵprov = ɵɵdefineInjectable({ factory: function PersonService_Factory() { return new PersonService(ɵɵinject(GraphqlService), ɵɵinject(PlatformService), ɵɵinject(NetworkService), ɵɵinject(EntitiesStorage)); }, token: PersonService, providedIn: "root" });
27696
+ 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" });
27631
27697
  PersonService.decorators = [
27632
27698
  { type: Injectable, args: [{ providedIn: 'root' },] }
27633
27699
  ];
@@ -27658,7 +27724,7 @@ class PersonValidatorService {
27658
27724
  return this.formBuilder.group(formConfig);
27659
27725
  }
27660
27726
  }
27661
- PersonValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
27727
+ PersonValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
27662
27728
  PersonValidatorService.decorators = [
27663
27729
  { type: Injectable, args: [{ providedIn: 'root' },] }
27664
27730
  ];
@@ -27887,17 +27953,17 @@ AdminModule.decorators = [
27887
27953
  ];
27888
27954
  AdminModule.ctorParameters = () => [];
27889
27955
 
27890
- const ɵ0$c = {
27956
+ const ɵ0 = {
27891
27957
  profile: 'ADMIN'
27892
27958
  };
27893
- const routes = [
27959
+ const routes$6 = [
27894
27960
  {
27895
27961
  path: 'users',
27896
27962
  pathMatch: 'full',
27897
27963
  component: UsersPage,
27898
27964
  canActivate: [AuthGuardService],
27899
27965
  canDeactivate: [ComponentDirtyGuard],
27900
- data: ɵ0$c
27966
+ data: ɵ0
27901
27967
  }
27902
27968
  ];
27903
27969
  class AdminRoutingModule {
@@ -27907,27 +27973,27 @@ AdminRoutingModule.decorators = [
27907
27973
  imports: [
27908
27974
  SharedRoutingModule,
27909
27975
  AdminModule,
27910
- RouterModule.forChild(routes)
27976
+ RouterModule.forChild(routes$6)
27911
27977
  ],
27912
27978
  exports: [RouterModule]
27913
27979
  },] }
27914
27980
  ];
27915
27981
 
27916
- class EntityTestClass {
27982
+ class EntityTestClass$1 {
27917
27983
  }
27918
- const FAKE_ENTITIES = [
27984
+ const FAKE_ENTITIES$1 = [
27919
27985
  { id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments... again for A' },
27920
27986
  { id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments... again for B' },
27921
27987
  { id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments... again for C' }
27922
27988
  ];
27923
- function deepCopy(values, size) {
27989
+ function deepCopy$1(values, size) {
27924
27990
  if (isNil(size)) {
27925
- return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
27991
+ return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
27926
27992
  }
27927
27993
  let result = [];
27928
27994
  let i = 1;
27929
27995
  while (result.length < size) {
27930
- result = result.concat((values || FAKE_ENTITIES).map(entity => {
27996
+ result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
27931
27997
  const name = entity.name + ' #' + i;
27932
27998
  return Object.assign(Object.assign({}, entity), { id: i++, name });
27933
27999
  }));
@@ -27937,7 +28003,7 @@ function deepCopy(values, size) {
27937
28003
  class AutocompleteTestPage {
27938
28004
  constructor(formBuilder) {
27939
28005
  this.formBuilder = formBuilder;
27940
- this._items = deepCopy(FAKE_ENTITIES, 100);
28006
+ this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
27941
28007
  this._$items = new BehaviorSubject(undefined);
27942
28008
  this.autocompleteFields = new MatAutocompleteConfigHolder();
27943
28009
  this.memoryHide = false;
@@ -27982,7 +28048,7 @@ class AutocompleteTestPage {
27982
28048
  });
27983
28049
  // From items
27984
28050
  this.autocompleteFields.add('entity-items-large', {
27985
- items: FAKE_ENTITIES.slice(),
28051
+ items: FAKE_ENTITIES$1.slice(),
27986
28052
  attributes: ['label', 'name', 'description', 'comments'],
27987
28053
  displayWith: this.entityToString
27988
28054
  });
@@ -28014,14 +28080,14 @@ class AutocompleteTestPage {
28014
28080
  loadData() {
28015
28081
  return __awaiter(this, void 0, void 0, function* () {
28016
28082
  const data = {
28017
- entity: deepCopy(FAKE_ENTITIES)[0],
28018
- farEntity: deepCopy(FAKE_ENTITIES)[2],
28083
+ entity: deepCopy$1(FAKE_ENTITIES$1)[0],
28084
+ farEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
28019
28085
  // This item is NOT in the items list => i should be displayed anyway
28020
28086
  missingEntity: {
28021
28087
  id: -1, label: '??', name: 'Missing item'
28022
28088
  },
28023
- disableEntity: deepCopy(FAKE_ENTITIES)[2],
28024
- entities: deepCopy(FAKE_ENTITIES)
28089
+ disableEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
28090
+ entities: deepCopy$1(FAKE_ENTITIES$1)
28025
28091
  };
28026
28092
  this.form.setValue(data);
28027
28093
  // Load observables
@@ -28171,13 +28237,13 @@ LatLongTestPage.ctorParameters = () => [
28171
28237
  { type: FormBuilder }
28172
28238
  ];
28173
28239
 
28174
- const moment$7 = momentImported;
28240
+ const moment$3 = momentImported;
28175
28241
  class SwipeTestPage {
28176
28242
  constructor(formBuilder, dateFormatPipe) {
28177
28243
  this.formBuilder = formBuilder;
28178
28244
  this.dateFormatPipe = dateFormatPipe;
28179
28245
  this.$dates = new BehaviorSubject(undefined);
28180
- this._today = moment$7().startOf('day');
28246
+ this._today = moment$3().startOf('day');
28181
28247
  this.form = formBuilder.group({
28182
28248
  empty: [null, Validators.required],
28183
28249
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -28190,7 +28256,7 @@ class SwipeTestPage {
28190
28256
  ngOnInit() {
28191
28257
  const dates = [];
28192
28258
  for (let d = 0; d < 7; d++) {
28193
- dates[d] = moment$7(this._today).add(d - 3, 'day');
28259
+ dates[d] = moment$3(this._today).add(d - 3, 'day');
28194
28260
  }
28195
28261
  this.$dates.next(dates);
28196
28262
  this.loadData();
@@ -28231,7 +28297,7 @@ SwipeTestPage.ctorParameters = () => [
28231
28297
  { type: DateFormatPipe }
28232
28298
  ];
28233
28299
 
28234
- const moment$8 = momentImported;
28300
+ const moment$2 = momentImported;
28235
28301
  class DateTimeTestPage {
28236
28302
  constructor(platform, formBuilder, cd) {
28237
28303
  this.platform = platform;
@@ -28265,7 +28331,7 @@ class DateTimeTestPage {
28265
28331
  // Load the form with data
28266
28332
  loadData() {
28267
28333
  return __awaiter(this, void 0, void 0, function* () {
28268
- const now = moment$8();
28334
+ const now = moment$2();
28269
28335
  const data = {
28270
28336
  empty: null,
28271
28337
  emptyRequired: null,
@@ -28331,9 +28397,9 @@ DateTimeTestPage.ctorParameters = () => [
28331
28397
  { type: ChangeDetectorRef }
28332
28398
  ];
28333
28399
 
28334
- class EntityTestClass$1 {
28400
+ class EntityTestClass {
28335
28401
  }
28336
- const FAKE_ENTITIES$1 = [
28402
+ const FAKE_ENTITIES = [
28337
28403
  { id: 1, label: 'AAA', name: 'Item A' },
28338
28404
  { id: 2, label: 'BBB', name: 'Item B' },
28339
28405
  { id: 3, label: 'CCC', name: 'Item C' },
@@ -28342,14 +28408,14 @@ const FAKE_ENTITIES$1 = [
28342
28408
  { id: 6, label: 'FFF', name: 'Item F' },
28343
28409
  { id: 7, label: 'GGG', name: 'Item G' }
28344
28410
  ];
28345
- function deepCopy$1(values, size) {
28411
+ function deepCopy(values, size) {
28346
28412
  if (isNil(size)) {
28347
- return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
28413
+ return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
28348
28414
  }
28349
28415
  let result = [];
28350
28416
  let i = 1;
28351
28417
  while (result.length < size) {
28352
- result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
28418
+ result = result.concat((values || FAKE_ENTITIES).map(entity => {
28353
28419
  const name = entity.name + ' #' + i;
28354
28420
  return Object.assign(Object.assign({}, entity), { id: i++, name });
28355
28421
  }));
@@ -28359,7 +28425,7 @@ function deepCopy$1(values, size) {
28359
28425
  class ChipsTestPage {
28360
28426
  constructor(formBuilder) {
28361
28427
  this.formBuilder = formBuilder;
28362
- this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
28428
+ this._items = deepCopy(FAKE_ENTITIES, 100);
28363
28429
  this._$items = new BehaviorSubject(undefined);
28364
28430
  this.autocompleteFields = new MatAutocompleteConfigHolder();
28365
28431
  this.appearance = 'legacy';
@@ -28399,7 +28465,7 @@ class ChipsTestPage {
28399
28465
  // Load the form with data
28400
28466
  loadData() {
28401
28467
  return __awaiter(this, void 0, void 0, function* () {
28402
- const items = deepCopy$1(FAKE_ENTITIES$1);
28468
+ const items = deepCopy(FAKE_ENTITIES);
28403
28469
  const data = {
28404
28470
  entity: items.slice(0, 1),
28405
28471
  entityInitial: items.slice(1, 2),
@@ -28515,7 +28581,7 @@ NumpadTestPage.ctorParameters = () => [
28515
28581
  { type: FormBuilder }
28516
28582
  ];
28517
28583
 
28518
- const moment$9 = momentImported;
28584
+ const moment$1 = momentImported;
28519
28585
  class DateTestPage {
28520
28586
  constructor(formBuilder, cd) {
28521
28587
  this.formBuilder = formBuilder;
@@ -28548,7 +28614,7 @@ class DateTestPage {
28548
28614
  // Load the form with data
28549
28615
  loadData() {
28550
28616
  return __awaiter(this, void 0, void 0, function* () {
28551
- const now = moment$9();
28617
+ const now = moment$1();
28552
28618
  const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
28553
28619
  const data = {
28554
28620
  empty: null,
@@ -28626,7 +28692,7 @@ const SHARED_MATERIAL_TESTING_PAGES = [
28626
28692
  { label: 'Shared directives', divider: true },
28627
28693
  { label: 'Badge icon directive', page: '/testing/shared/badge-icon' }
28628
28694
  ];
28629
- const routes$1 = [
28695
+ const routes$5 = [
28630
28696
  {
28631
28697
  path: '',
28632
28698
  pathMatch: 'full',
@@ -28683,7 +28749,7 @@ MaterialTestingModule.decorators = [
28683
28749
  ReactiveFormsModule,
28684
28750
  SharedMaterialModule,
28685
28751
  TranslateModule.forChild(),
28686
- RouterModule.forChild(routes$1)
28752
+ RouterModule.forChild(routes$5)
28687
28753
  ],
28688
28754
  declarations: [
28689
28755
  DateTimeTestPage,
@@ -28744,7 +28810,7 @@ ToastTestingPage.ctorParameters = () => [
28744
28810
  { type: TranslateService }
28745
28811
  ];
28746
28812
 
28747
- const routes$2 = [
28813
+ const routes$4 = [
28748
28814
  {
28749
28815
  path: 'toast',
28750
28816
  pathMatch: 'full',
@@ -28759,7 +28825,7 @@ ToastTestingModule.decorators = [
28759
28825
  CommonModule,
28760
28826
  IonicModule,
28761
28827
  TranslateModule.forChild(),
28762
- RouterModule.forChild(routes$2)
28828
+ RouterModule.forChild(routes$4)
28763
28829
  ],
28764
28830
  declarations: [
28765
28831
  ToastTestingPage
@@ -29046,33 +29112,28 @@ class TableTestPage extends AppTable {
29046
29112
  console.debug('[test-table] Updating data...');
29047
29113
  this.markAsLoading();
29048
29114
  if (isNil(this.data)) {
29049
- this.data = this.generateData(0, this.enableInfiniteScroll ? this.defaultPageSize : TableTestPage.maxRowCount);
29115
+ this.data = this.generateData(0, TableTestPage.maxRowCount);
29050
29116
  }
29051
29117
  this.dataService.setValue(this.data, { emitEvent: false });
29052
29118
  this.onRefresh.emit();
29053
- if (this.infiniteScroll) {
29054
- this.infiniteScroll.disabled = !this.infiniteScroll || this.data.length >= TableTestPage.maxRowCount;
29055
- }
29056
29119
  }
29057
- loadMore(event) {
29058
- console.debug('[table-test] Loading more...', event);
29059
- setTimeout(() => {
29060
- this.data = [
29061
- ...this.data,
29062
- ...this.generateData(this.data.length, 20)
29063
- ];
29064
- this.dataService.setValue(this.data, { emitEvent: false });
29065
- this.defaultPageSize = this.data.length;
29066
- this.infiniteScroll.disabled = this.data.length >= 100;
29067
- this.doRefresh(event);
29068
- }, 500);
29120
+ fetchMore(event) {
29121
+ return __awaiter(this, void 0, void 0, function* () {
29122
+ console.debug('[table-test] Loading more...', event);
29123
+ const fetched = yield this._dataSource.fetchMore();
29124
+ // When target wait for a complete (e.g. IonRefresher)
29125
+ if (fetched && (event === null || event === void 0 ? void 0 : event.target) && event.target.complete) {
29126
+ yield this.waitIdle();
29127
+ event.target.complete();
29128
+ }
29129
+ });
29069
29130
  }
29070
- save() {
29131
+ save(opts) {
29071
29132
  const _super = Object.create(null, {
29072
29133
  save: { get: () => super.save }
29073
29134
  });
29074
29135
  return __awaiter(this, void 0, void 0, function* () {
29075
- const saved = yield _super.save.call(this);
29136
+ const saved = yield _super.save.call(this, opts);
29076
29137
  if (saved) {
29077
29138
  // Update source data
29078
29139
  this.data = this.dataService.value;
@@ -29138,7 +29199,7 @@ TableTestPage.maxRowCount = 100;
29138
29199
  TableTestPage.decorators = [
29139
29200
  { type: Component, args: [{
29140
29201
  selector: 'app-table-testing',
29141
- template: "<app-toolbar color=\"primary\" [canGoBack]=\"true\" [backHref]=\"'/testing'\">\n <ion-buttons slot=\"end\">\n\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n\n <!-- start/stop timer to auto-load data -->\n <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n *ngIf=\"canEdit\" [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n <!-- duplicate -->\n <button mat-icon-button\n *ngIf=\"canEdit && selection.selected | isArrayLength: {equals: 1}\"\n [title]=\"'COMMON.BTN_DUPLICATE'|translate\"\n (click)=\"duplicateRow($event, selection.selected[0])\">\n <mat-icon>file_copy</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search text -->\n <mat-form-field>\n <ion-icon matPrefix name=\"search\"></ion-icon>\n <input matInput\n formControlName=\"searchText\"\n autocomplete=\"off\"\n [placeholder]=\"'TABLE.TESTING.SEARCH_TEXT'|translate\">\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- table -->\n <div [class.table-container]=\"!enableInfiniteScroll\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <!-- group header cells -->\n\n <ng-container matColumnDef=\"top-start\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n <!-- start spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-1\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\" style=\"background-color: whitesmoke; margin-bottom: -1px;\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_1'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-2\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_2'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"top-end\" >\n <th mat-header-cell *matHeaderCellDef>\n <!-- end spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n </ng-container>\n\n <!-- Label column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['label']\"\n [placeholder]=\"'TABLE.TESTING.LABEL'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'label'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.NAME</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator?.controls.name\" [placeholder]=\"'TABLE.TESTING.NAME'|translate\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Level column -->\n <ng-container matColumnDef=\"levelId\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-autocomplete-field floatLabel=\"never\"\n [formControl]=\"row.validator.controls.levelId\"\n [config]=\"autocompleteFields.level\"\n [readonly]=\"!row.editing\"\n required>\n </mat-autocomplete-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"statusId\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value &gt;=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\" [placeholder]=\"i18nColumnPrefix + 'STATUS_ID'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value &gt;=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id!==-1\">\n <small [matTooltip]=\"'TABLE.TESTING.CREATION_DATE'|translate\" *ngIf=\"row.currentData.creationDate; let creationDate\">\n <ion-icon name=\"calendar\"></ion-icon>\n {{ creationDate | dateFormat: {time: true} }}\n </small><br/>\n <small [matTooltip]=\"'TABLE.TESTING.UPDATE_DATE'|translate\" *ngIf=\"row.currentData.updateDate; let updateDate\">\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ updateDate | dateFormat: {time: true} }}\n </small>\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Comment column -->\n <ng-container matColumnDef=\"comments\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\" *ngIf=\"row.editing; else iconComment\">\n <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"></textarea>-->\n\n <input type=\"text\" matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'comments'\">\n </mat-form-field>\n\n <ng-template #iconComment>\n <mat-icon class=\"comment\"\n *ngIf=\"row.validator?.controls.comments.value\"\n [title]=\"row.validator?.controls.comments.value\"></mat-icon>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"true\" [canCancel]=\"false\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"groupColumns;\" class=\"mat-toolbar\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-disabled]=\"!row.editing\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n <ion-infinite-scroll *ngIf=\"enableInfiniteScroll\"\n [threshold]=\"mobile ? '10%' : '2%'\" position=\"bottom\"\n (ionInfinite)=\"loadMore($event)\">\n <ion-infinite-scroll-content\n loadingSpinner=\"circles\"\n [loadingText]=\"'COMMON.LOADING_DOTS'|translate\">\n </ion-infinite-scroll-content>\n </ion-infinite-scroll>\n </div>\n</ion-content>\n\n<ion-footer>\n <!-- Paginator -->\n <mat-paginator *ngIf=\"!enableInfiniteScroll\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\"\n class=\"mat-paginator-footer\"\n showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"canEdit && !mobile\"\n (onCancel)=\"load()\"\n (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\">\n <!-- error -->\n <ion-item *ngIf=\"error$|async\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\"\n *ngIf=\"canEdit && mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n",
29202
+ template: "<app-toolbar color=\"primary\" [canGoBack]=\"true\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\"\n [backHref]=\"'/testing'\">\n <ion-buttons slot=\"end\">\n\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n\n <!-- start/stop timer to auto-load data -->\n <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n *ngIf=\"canEdit\" [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n <!-- duplicate -->\n <button mat-icon-button\n *ngIf=\"canEdit && selection.selected | isArrayLength: {equals: 1}\"\n [title]=\"'COMMON.BTN_DUPLICATE'|translate\"\n (click)=\"duplicateRow($event, selection.selected[0])\">\n <mat-icon>file_copy</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search text -->\n <mat-form-field>\n <ion-icon matPrefix name=\"search\"></ion-icon>\n <input matInput\n formControlName=\"searchText\"\n autocomplete=\"off\"\n [placeholder]=\"'TABLE.TESTING.SEARCH_TEXT'|translate\">\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- table -->\n <div [class.table-container]=\"!enableInfiniteScroll\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <!-- group header cells -->\n\n <ng-container matColumnDef=\"top-start\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n <!-- start spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-1\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\" style=\"background-color: whitesmoke; margin-bottom: -1px;\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_1'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-2\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_2'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"top-end\" >\n <th mat-header-cell *matHeaderCellDef>\n <!-- end spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n </ng-container>\n\n <!-- Label column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['label']\"\n [placeholder]=\"'TABLE.TESTING.LABEL'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'label'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.NAME</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator?.controls.name\" [placeholder]=\"'TABLE.TESTING.NAME'|translate\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Level column -->\n <ng-container matColumnDef=\"levelId\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-autocomplete-field floatLabel=\"never\"\n [formControl]=\"row.validator.controls.levelId\"\n [config]=\"autocompleteFields.level\"\n [readonly]=\"!row.editing\"\n required>\n </mat-autocomplete-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"statusId\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value &gt;=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\" [placeholder]=\"i18nColumnPrefix + 'STATUS_ID'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value &gt;=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id!==-1\">\n <small [matTooltip]=\"'TABLE.TESTING.CREATION_DATE'|translate\" *ngIf=\"row.currentData.creationDate; let creationDate\">\n <ion-icon name=\"calendar\"></ion-icon>\n {{ creationDate | dateFormat: {time: true} }}\n </small><br/>\n <small [matTooltip]=\"'TABLE.TESTING.UPDATE_DATE'|translate\" *ngIf=\"row.currentData.updateDate; let updateDate\">\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ updateDate | dateFormat: {time: true} }}\n </small>\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Comment column -->\n <ng-container matColumnDef=\"comments\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\" *ngIf=\"row.editing; else iconComment\">\n <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"></textarea>-->\n\n <input type=\"text\" matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'comments'\">\n </mat-form-field>\n\n <ng-template #iconComment>\n <mat-icon class=\"comment\"\n *ngIf=\"row.validator?.controls.comments.value\"\n [title]=\"row.validator?.controls.comments.value\"></mat-icon>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"true\" [canCancel]=\"false\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"groupColumns;\" class=\"mat-toolbar\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-disabled]=\"!row.editing\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n <ion-infinite-scroll *ngIf=\"enableInfiniteScroll\"\n [threshold]=\"mobile ? '10%' : '2%'\" position=\"bottom\"\n (ionInfinite)=\"fetchMore($event)\">\n <ion-infinite-scroll-content\n loadingSpinner=\"circles\"\n [loadingText]=\"'COMMON.LOADING_DOTS'|translate\">\n </ion-infinite-scroll-content>\n </ion-infinite-scroll>\n </div>\n</ion-content>\n\n<ion-footer>\n <!-- Paginator -->\n <mat-paginator *ngIf=\"!enableInfiniteScroll\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\"\n class=\"mat-paginator-footer\"\n showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"canEdit && !mobile\"\n (onCancel)=\"load()\"\n (onSave)=\"save()\"\n [disabled]=\"(loadingSubject|async) || !dirty\">\n <!-- error -->\n <ion-item *ngIf=\"error$|async\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\"\n *ngIf=\"canEdit && mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n",
29142
29203
  providers: [
29143
29204
  {
29144
29205
  provide: AppValidatorService,
@@ -29218,7 +29279,7 @@ TextPopoverTestingPage.ctorParameters = () => [
29218
29279
  { type: PopoverController }
29219
29280
  ];
29220
29281
 
29221
- const routes$4 = [
29282
+ const routes$2 = [
29222
29283
  {
29223
29284
  path: 'text-popover',
29224
29285
  pathMatch: 'full',
@@ -29233,7 +29294,7 @@ TextPopoverTestingModule.decorators = [
29233
29294
  CommonModule,
29234
29295
  IonicModule,
29235
29296
  TranslateModule.forChild(),
29236
- RouterModule.forChild(routes$4)
29297
+ RouterModule.forChild(routes$2)
29237
29298
  ],
29238
29299
  declarations: [
29239
29300
  TextPopoverTestingPage
@@ -29250,7 +29311,7 @@ const CORE_TESTING_PAGES = [
29250
29311
  { label: 'Table', page: '/testing/core/table' },
29251
29312
  { label: 'Text popover', page: '/testing/core/text-popover' }
29252
29313
  ];
29253
- const routes$5 = [
29314
+ const routes$1 = [
29254
29315
  {
29255
29316
  path: '',
29256
29317
  pathMatch: 'full',
@@ -29274,7 +29335,7 @@ CoreTestingModule.decorators = [
29274
29335
  imports: [
29275
29336
  CommonModule,
29276
29337
  TranslateModule.forChild(),
29277
- RouterModule.forChild(routes$5),
29338
+ RouterModule.forChild(routes$1),
29278
29339
  // Sub modules
29279
29340
  TableTestingModule,
29280
29341
  TextPopoverTestingModule
@@ -29577,7 +29638,7 @@ UserEventTestService.ctorParameters = () => [
29577
29638
  { type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
29578
29639
  ];
29579
29640
 
29580
- const moment$a = momentImported;
29641
+ const moment = momentImported;
29581
29642
  class UserEventTestingPage {
29582
29643
  constructor(userEventService, router, alertController, translateService) {
29583
29644
  this.userEventService = userEventService;
@@ -29638,7 +29699,7 @@ class UserEventTestingPage {
29638
29699
  type: 'message',
29639
29700
  level: 'INFO',
29640
29701
  message: 'message test message test message test message test message test message test message test message test',
29641
- creationDate: moment$a(),
29702
+ creationDate: moment(),
29642
29703
  }));
29643
29704
  }
29644
29705
  addError() {
@@ -29648,7 +29709,7 @@ class UserEventTestingPage {
29648
29709
  type: 'upload',
29649
29710
  level: 'ERROR',
29650
29711
  message: 'message error',
29651
- creationDate: moment$a(),
29712
+ creationDate: moment(),
29652
29713
  }));
29653
29714
  }
29654
29715
  addWarning() {
@@ -29658,7 +29719,7 @@ class UserEventTestingPage {
29658
29719
  type: 'download',
29659
29720
  level: 'WARNING',
29660
29721
  message: 'message warning',
29661
- creationDate: moment$a(),
29722
+ creationDate: moment(),
29662
29723
  }));
29663
29724
  }
29664
29725
  addDebug() {
@@ -29668,7 +29729,7 @@ class UserEventTestingPage {
29668
29729
  type: 'debug',
29669
29730
  level: 'DEBUG',
29670
29731
  message: 'message DEBUG',
29671
- creationDate: moment$a(),
29732
+ creationDate: moment(),
29672
29733
  }));
29673
29734
  }
29674
29735
  addNotificationWithLink() {
@@ -29678,7 +29739,7 @@ class UserEventTestingPage {
29678
29739
  type: 'message',
29679
29740
  level: 'INFO',
29680
29741
  message: 'message with link',
29681
- creationDate: moment$a(),
29742
+ creationDate: moment(),
29682
29743
  actions: [{
29683
29744
  name: 'click here',
29684
29745
  iconRef: {
@@ -29695,7 +29756,7 @@ class UserEventTestingPage {
29695
29756
  type: 'message',
29696
29757
  level: 'INFO',
29697
29758
  message: 'message with action',
29698
- creationDate: moment$a(),
29759
+ creationDate: moment(),
29699
29760
  actions: [
29700
29761
  {
29701
29762
  name: 'click here',
@@ -29767,7 +29828,7 @@ class UserEventTestingPage {
29767
29828
  type: 'message',
29768
29829
  level: 'INFO',
29769
29830
  message: 'message with action',
29770
- creationDate: moment$a(),
29831
+ creationDate: moment(),
29771
29832
  actions: [
29772
29833
  {
29773
29834
  default: true,
@@ -29821,7 +29882,7 @@ const SOCIAL_TESTING_PAGES = [
29821
29882
  { label: 'User event', page: '/testing/social/user-event' },
29822
29883
  { label: 'Job progression', page: '/testing/social/job-progression' }
29823
29884
  ];
29824
- const routes$6 = [
29885
+ const routes = [
29825
29886
  {
29826
29887
  path: 'job-progression',
29827
29888
  pathMatch: 'full',
@@ -29840,7 +29901,7 @@ SocialTestingModule.decorators = [
29840
29901
  imports: [
29841
29902
  CommonModule,
29842
29903
  TranslateModule.forChild(),
29843
- RouterModule.forChild(routes$6),
29904
+ RouterModule.forChild(routes),
29844
29905
  JobTestingModule,
29845
29906
  UserEventTestingModule
29846
29907
  ],
@@ -29853,5 +29914,5 @@ SocialTestingModule.decorators = [
29853
29914
  * Generated bundle index. Do not edit.
29854
29915
  */
29855
29916
 
29856
- export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_MENU_OPTIONS, APP_TESTING_PAGES, AboutModal, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppIconComponent, AppIconModule, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppUserEventNotificationIcon, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, Fragments$1 as Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, ImagesUtils, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, Job, JobModule, JobProgression, JobProgressionComponent, JobProgressionService, JobProgressionServiceToken, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuOptions, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, ResizableComponent, ResizableDirective, ResizableModule, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, USER_EVENT_SERVICE, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UserEventModule, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isBlankString, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moment$5 as moment, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, tz, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending, ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppUpdateOfflineModeCard as ɵi, UserEventNotificationList as ɵj, JobProgressionList as ɵk, DateTestPage as ɵl, NumpadTestPage as ɵm, MatBadgeIconTestPage as ɵn, ToastTestingModule as ɵo, ToastTestingPage as ɵp };
29917
+ export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_MENU_OPTIONS, APP_TESTING_PAGES, AboutModal, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppIconComponent, AppIconModule, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableUtils, AppUserEventNotificationIcon, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, ImagesUtils, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, Job, JobModule, JobProgression, JobProgressionComponent, JobProgressionService, JobProgressionServiceToken, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuOptions, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, ResizableComponent, ResizableDirective, ResizableModule, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, USER_EVENT_SERVICE, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UserEventModule, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isBlankString, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moment$5 as moment, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, tz, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending, ɵ0$c as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppUpdateOfflineModeCard as ɵi, UserEventNotificationList as ɵj, JobProgressionList as ɵk, DateTestPage as ɵl, NumpadTestPage as ɵm, MatBadgeIconTestPage as ɵn, ToastTestingModule as ɵo, ToastTestingPage as ɵp };
29857
29918
  //# sourceMappingURL=sumaris-net.ngx-components.js.map