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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,12 @@
1
- import { InjectionToken, EventEmitter, Component, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, Output, ViewChild, ɵɵdefineInjectable, ɵɵinject, Pipe, Injectable, Directive, Inject, NgModule, ElementRef, TemplateRef, ViewContainerRef, HostBinding, HostListener, ViewChildren, ComponentFactoryResolver, ApplicationRef, INJECTOR, Injector, Renderer2, ViewEncapsulation } from '@angular/core';
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, EventEmitter, Component, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, Output, ViewChild, Pipe, Injectable, Directive, Inject, NgModule, ElementRef, TemplateRef, ViewContainerRef, HostBinding, HostListener, ViewChildren, ComponentFactoryResolver, ApplicationRef, Injector, Renderer2, ViewEncapsulation } from '@angular/core';
3
+ import * as i1$3 from '@angular/common';
2
4
  import { CommonModule, DOCUMENT, Location } from '@angular/common';
3
5
  import { CdkTableModule } from '@angular/cdk/table';
4
6
  import { A11yModule } from '@angular/cdk/a11y';
5
7
  import { OverlayModule, OverlayContainer, FullscreenOverlayContainer, Overlay } from '@angular/cdk/overlay';
6
8
  import { ScrollingModule } from '@angular/cdk/scrolling';
9
+ import * as i1$2 from '@angular/material/core';
7
10
  import { DateAdapter, MatCommonModule, MatRippleModule } from '@angular/material/core';
8
11
  import { MatTableModule, 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,39 @@ 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
71
  import { mergeMap as mergeMap$1 } from 'rxjs/internal/operators';
61
72
  import { DragDropModule } from '@angular/cdk/drag-drop';
62
73
  import { MarkdownModule } from 'ngx-markdown';
63
74
  import { sign, box, hash, verify } from 'tweetnacl';
75
+ import * as i3$1 from '@ionic/storage';
64
76
  import { Storage, IonicStorageModule } from '@ionic/storage';
65
77
  import 'zone.js/dist/zone-error';
66
- import { SplashScreen as SplashScreen$1 } from '@ionic-native/splash-screen/ngx';
67
- import { Connection, Network as Network$1 } from '@ionic-native/network/ngx';
68
- import { CacheService as CacheService$1, CacheModule } from 'ionic-cache';
69
- import { CacheService } from 'ionic-cache/dist/cache.service';
70
- import { Network } from '@ionic-native/network/ngx/index';
71
- import { SplashScreen } from '@ionic-native/splash-screen/ngx/index';
72
- import { StatusBar as StatusBar$1 } from '@ionic-native/status-bar/ngx';
78
+ import { SplashScreen } from '@ionic-native/splash-screen/ngx';
79
+ import { Connection, Network } from '@ionic-native/network/ngx';
80
+ import { CacheService, CacheModule } from 'ionic-cache';
81
+ import * as i6 from 'ionic-cache/dist/cache.service';
82
+ import * as i9 from '@ionic-native/network/ngx/index';
83
+ import * as i10 from '@ionic-native/splash-screen/ngx/index';
84
+ import { StatusBar } from '@ionic-native/status-bar/ngx';
85
+ import * as i2$4 from '@angular/cdk/platform';
73
86
  import { Platform as Platform$1 } from '@angular/cdk/platform';
74
- import { InAppBrowser as InAppBrowser$1 } from '@ionic-native/in-app-browser/ngx';
87
+ import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
75
88
  import { ApolloLink, NetworkStatus, InMemoryCache, ApolloClient, gql } from '@apollo/client/core';
89
+ import * as i2$3 from 'apollo-angular';
76
90
  import { Apollo } from 'apollo-angular';
77
91
  import { WebSocketLink } from '@apollo/client/link/ws';
78
92
  import { getMainDefinition } from '@apollo/client/utilities';
@@ -80,13 +94,14 @@ import { RetryLink } from '@apollo/client/link/retry';
80
94
  import QueueLink from 'apollo-link-queue';
81
95
  import SerializingLink from 'apollo-link-serialize';
82
96
  import loggerLink from 'apollo-link-logger';
97
+ import * as i3$2 from 'apollo-angular/http';
83
98
  import { HttpLink } from 'apollo-angular/http';
84
99
  import { IonicStorageWrapper, persistCache } from 'apollo3-cache-persist';
85
- import { NotificationVisibility, Downloader as Downloader$1 } from '@ionic-native/downloader/ngx';
86
- import { StatusBar } from '@ionic-native/status-bar/ngx/index';
87
- import { Keyboard as Keyboard$1 } from '@ionic-native/keyboard/ngx/index';
88
- import { InAppBrowser } from '@ionic-native/in-app-browser/ngx/index';
89
- import { Downloader } from '@ionic-native/downloader/ngx/index';
100
+ import { NotificationVisibility, Downloader } from '@ionic-native/downloader/ngx';
101
+ import * as i14 from '@ionic-native/status-bar/ngx/index';
102
+ import * as i15 from '@ionic-native/keyboard/ngx/index';
103
+ import * as i17 from '@ionic-native/in-app-browser/ngx/index';
104
+ import * as i18 from '@ionic-native/downloader/ngx/index';
90
105
  import { CdkTextareaAutosize } from '@angular/cdk/text-field';
91
106
  import { ValidatorService, TableDataSource } from '@e-is/ngx-material-table';
92
107
  import { SelectionModel } from '@angular/cdk/collections';
@@ -480,6 +495,7 @@ function equals(o1, o2) {
480
495
  }
481
496
  return false;
482
497
  }
498
+ // @dynamic
483
499
  class Beans {
484
500
  /**
485
501
  * Copy a source object, by including only properties of the given dataType.
@@ -513,6 +529,15 @@ class Beans {
513
529
  return isNotNil(value);
514
530
  }) === -1;
515
531
  }
532
+ static collectById(array) {
533
+ return this.collectByProperty(array, 'id');
534
+ }
535
+ static collectByProperty(array, propertyName) {
536
+ return (array || []).reduce((res, item) => {
537
+ res['' + propertyName] = item;
538
+ return res;
539
+ }, {});
540
+ }
516
541
  }
517
542
 
518
543
  function isFocusableElement(object) {
@@ -1036,7 +1061,7 @@ const isIpad = (win) => {
1036
1061
  }
1037
1062
  return false;
1038
1063
  };
1039
- const ɵ0 = isIpad;
1064
+ const ɵ0$c = isIpad;
1040
1065
  const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
1041
1066
  const isAndroid = (win) => testUserAgent(win, /android|sink/i);
1042
1067
  const isCordova = (win) => {
@@ -1168,14 +1193,14 @@ class MatAutocompleteFieldUtils {
1168
1193
  return isNotNil(o1 === null || o1 === void 0 ? void 0 : o1.id) && o1.id === (o2 === null || o2 === void 0 ? void 0 : o2.id);
1169
1194
  }
1170
1195
  }
1171
- const noop = (_) => { };
1172
- const ɵ0$1 = noop;
1196
+ const noop$8 = (_) => { };
1197
+ const ɵ0$b = noop$8;
1173
1198
  class MatAutocompleteField {
1174
1199
  constructor(cd, formGroupDir) {
1175
1200
  this.cd = cd;
1176
1201
  this.formGroupDir = formGroupDir;
1177
- this._onChangeCallback = noop;
1178
- this._onTouchedCallback = noop;
1202
+ this._onChangeCallback = noop$8;
1203
+ this._onTouchedCallback = noop$8;
1179
1204
  this.logPrefix = '[mat-autocomplete] ';
1180
1205
  this.formControlName = null;
1181
1206
  this.required = false;
@@ -1948,7 +1973,7 @@ class DateFormatPipe {
1948
1973
  return isMoment(value) ? value : this.dateAdapter.parse(value, parseFormat || DATE_ISO_PATTERN);
1949
1974
  }
1950
1975
  }
1951
- DateFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(ɵɵinject(MomentDateAdapter), ɵɵinject(TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1976
+ 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
1977
  DateFormatPipe.decorators = [
1953
1978
  { type: Pipe, args: [{
1954
1979
  name: 'dateFormat'
@@ -1960,7 +1985,7 @@ DateFormatPipe.ctorParameters = () => [
1960
1985
  { type: TranslateService }
1961
1986
  ];
1962
1987
 
1963
- const moment = momentImported;
1988
+ const moment$a = momentImported;
1964
1989
  class DateDiffDurationPipe {
1965
1990
  constructor(dateAdapter, translate) {
1966
1991
  this.dateAdapter = dateAdapter;
@@ -1976,11 +2001,11 @@ class DateDiffDurationPipe {
1976
2001
  return this.format(startDate, endDate, args);
1977
2002
  }
1978
2003
  format(startDate, endDate, args) {
1979
- const duration = moment.duration(endDate.diff(startDate));
2004
+ const duration = moment$a.duration(endDate.diff(startDate));
1980
2005
  if (duration.asMinutes() < 0)
1981
2006
  return '';
1982
2007
  const withSeconds = args === null || args === void 0 ? void 0 : args.seconds;
1983
- const timeDuration = moment(0)
2008
+ const timeDuration = moment$a(0)
1984
2009
  .hour(duration.hours())
1985
2010
  .minute(duration.minutes());
1986
2011
  if (withSeconds) {
@@ -1990,7 +2015,7 @@ class DateDiffDurationPipe {
1990
2015
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + timeDuration.format(withSeconds ? 'HH:mm:ss' : 'HH:mm');
1991
2016
  }
1992
2017
  }
1993
- DateDiffDurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateDiffDurationPipe_Factory() { return new DateDiffDurationPipe(ɵɵinject(DateAdapter), ɵɵinject(TranslateService)); }, token: DateDiffDurationPipe, providedIn: "root" });
2018
+ 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
2019
  DateDiffDurationPipe.decorators = [
1995
2020
  { type: Pipe, args: [{
1996
2021
  name: 'dateDiffDuration'
@@ -2011,7 +2036,7 @@ class DateFromNowPipe {
2011
2036
  return date ? date.fromNow(args && args.withoutSuffix) : '';
2012
2037
  }
2013
2038
  }
2014
- DateFromNowPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(ɵɵinject(MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
2039
+ DateFromNowPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(i0.ɵɵinject(i1.MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
2015
2040
  DateFromNowPipe.decorators = [
2016
2041
  { type: Pipe, args: [{
2017
2042
  name: 'dateFromNow'
@@ -2080,7 +2105,7 @@ function formatToDD(value, opts) {
2080
2105
  value *= -1;
2081
2106
  }
2082
2107
  }
2083
- let degrees = roundFloat(value, opts.maxDecimals).toString();
2108
+ let degrees = roundFloat$1(value, opts.maxDecimals).toString();
2084
2109
  // Add sign
2085
2110
  let sign = negative ? '-' : '+';
2086
2111
  if (opts.placeholderChar) {
@@ -2131,7 +2156,7 @@ function formatToDDMMSS(value, opts) {
2131
2156
  }
2132
2157
  let degrees = Math.trunc(value);
2133
2158
  let minutes = Math.trunc((value - degrees) * 60);
2134
- let seconds = roundFloat(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
2159
+ let seconds = roundFloat$1(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
2135
2160
  while (seconds >= 60) {
2136
2161
  seconds -= 60;
2137
2162
  minutes += 1;
@@ -2199,7 +2224,7 @@ function formatToDDMM(value, opts) {
2199
2224
  }
2200
2225
  }
2201
2226
  let degrees = Math.trunc(value);
2202
- let minutes = roundFloat((value - degrees) * 60, opts.maxDecimals);
2227
+ let minutes = roundFloat$1((value - degrees) * 60, opts.maxDecimals);
2203
2228
  while (minutes >= 60) {
2204
2229
  minutes -= 60;
2205
2230
  degrees += 1;
@@ -2250,15 +2275,15 @@ function parseLatitudeOrLongitude(input, pattern, maxDecimals, placeholderChar)
2250
2275
  return NaN;
2251
2276
  }
2252
2277
  if (pattern === 'DD')
2253
- return roundFloat(degrees, maxDecimals);
2278
+ return roundFloat$1(degrees, maxDecimals);
2254
2279
  const minutes = (pattern === 'DDMMSS' || pattern === 'DDMM') && parts[1] && parseFloat(parts[1].replace(/,/g, '.')) || 0;
2255
2280
  const seconds = (pattern === 'DDMMSS') && parts[2] && parseFloat(parts[2].replace(/,/g, '.')) || 0;
2256
2281
  const direction = ((pattern === 'DDMMSS') && parts[3]) || ((pattern === 'DDMM') && parts[2]) || undefined;
2257
2282
  const sign = (direction && (direction === 's' || direction === 'S' || direction === 'w' || direction === 'W')) ? -1 : 1;
2258
2283
  degrees = sign * (degrees + minutes / 60 + seconds / (60 * 60));
2259
- return roundFloat(degrees, maxDecimals);
2284
+ return roundFloat$1(degrees, maxDecimals);
2260
2285
  }
2261
- function roundFloat(input, maxDecimals) {
2286
+ function roundFloat$1(input, maxDecimals) {
2262
2287
  if (maxDecimals > 0) {
2263
2288
  const powDecimal = Math.pow(10, maxDecimals);
2264
2289
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -2319,7 +2344,7 @@ class NumberFormatPipe {
2319
2344
  }
2320
2345
  }
2321
2346
  }
2322
- NumberFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2347
+ NumberFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2323
2348
  NumberFormatPipe.decorators = [
2324
2349
  { type: Pipe, args: [{
2325
2350
  name: 'numberFormat'
@@ -2359,7 +2384,7 @@ class HighlightPipe {
2359
2384
  }
2360
2385
  }
2361
2386
  }
2362
- HighlightPipe.ɵprov = ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2387
+ HighlightPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2363
2388
  HighlightPipe.decorators = [
2364
2389
  { type: Pipe, args: [{
2365
2390
  name: 'highlight'
@@ -2424,7 +2449,7 @@ FileSizePipe.decorators = [
2424
2449
  { type: Pipe, args: [{ name: 'fileSize' },] }
2425
2450
  ];
2426
2451
 
2427
- const moment$1 = momentImported;
2452
+ const moment$9 = momentImported;
2428
2453
  const DATE_UNIX_TIMESTAMP = 'X';
2429
2454
  const DATE_UNIX_MS_TIMESTAMP = 'x';
2430
2455
  const MOMENT_NO_TIME_PROPERTY = '_hasNoTime';
@@ -2513,37 +2538,37 @@ function fromDateISOString(value) {
2513
2538
  return value;
2514
2539
  if (typeof value === 'string' && value.length === 10) {
2515
2540
  // Parse the input value, as a date only
2516
- const dateOnly = moment$1(value, DATE_PATTERN);
2541
+ const dateOnly = moment$9(value, DATE_PATTERN);
2517
2542
  if (dateOnly.isValid())
2518
2543
  return DateUtils.markNoTime(dateOnly);
2519
2544
  }
2520
2545
  // Parse the input value, as a ISO date time
2521
- const date = moment$1(value, DATE_ISO_PATTERN);
2546
+ const date = moment$9(value, DATE_ISO_PATTERN);
2522
2547
  if (date.isValid())
2523
2548
  return date;
2524
2549
  // Not valid: trying to convert from unix timestamp
2525
2550
  if (typeof value === 'string') {
2526
2551
  console.warn('Wrong date format - Trying to convert from local time: ' + value);
2527
2552
  if (value.length === 10) {
2528
- return moment$1(value, DATE_UNIX_TIMESTAMP);
2553
+ return moment$9(value, DATE_UNIX_TIMESTAMP);
2529
2554
  }
2530
2555
  else if (value.length === 13) {
2531
- return moment$1(value, DATE_UNIX_MS_TIMESTAMP);
2556
+ return moment$9(value, DATE_UNIX_MS_TIMESTAMP);
2532
2557
  }
2533
2558
  }
2534
2559
  console.warn('Unable to parse date: ' + value);
2535
2560
  return undefined;
2536
2561
  }
2537
2562
  function fromUnixTimestamp(timeInSec) {
2538
- return moment$1(timeInSec, DATE_UNIX_TIMESTAMP);
2563
+ return moment$9(timeInSec, DATE_UNIX_TIMESTAMP);
2539
2564
  }
2540
2565
  function fromUnixMsTimestamp(timeInMs) {
2541
- return moment$1(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2566
+ return moment$9(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2542
2567
  }
2543
2568
  function toDuration(value, unit) {
2544
2569
  if (!value)
2545
2570
  return undefined;
2546
- const duration = moment$1.duration(value, unit);
2571
+ const duration = moment$9.duration(value, unit);
2547
2572
  // fix 990+ ms
2548
2573
  if (duration.milliseconds() >= 990) {
2549
2574
  duration.add(1000 - duration.milliseconds(), 'ms');
@@ -2572,7 +2597,7 @@ class DurationPipe {
2572
2597
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + hour + ':' + minute;
2573
2598
  }
2574
2599
  }
2575
- DurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(ɵɵinject(TranslateService)); }, token: DurationPipe, providedIn: "root" });
2600
+ DurationPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(i0.ɵɵinject(i1$1.TranslateService)); }, token: DurationPipe, providedIn: "root" });
2576
2601
  DurationPipe.decorators = [
2577
2602
  { type: Pipe, args: [{
2578
2603
  name: 'duration'
@@ -2593,7 +2618,7 @@ class MathAbsPipe {
2593
2618
  }
2594
2619
  }
2595
2620
  }
2596
- MathAbsPipe.ɵprov = ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2621
+ MathAbsPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2597
2622
  MathAbsPipe.decorators = [
2598
2623
  { type: Pipe, args: [{
2599
2624
  name: 'mathAbs'
@@ -2605,7 +2630,7 @@ class EvenPipe {
2605
2630
  return val % 2 === 0;
2606
2631
  }
2607
2632
  }
2608
- EvenPipe.ɵprov = ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2633
+ EvenPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2609
2634
  EvenPipe.decorators = [
2610
2635
  { type: Pipe, args: [{
2611
2636
  name: 'even'
@@ -2617,7 +2642,7 @@ class OddPipe {
2617
2642
  return val % 2 !== 0;
2618
2643
  }
2619
2644
  }
2620
- OddPipe.ɵprov = ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2645
+ OddPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2621
2646
  OddPipe.decorators = [
2622
2647
  { type: Pipe, args: [{
2623
2648
  name: 'odd'
@@ -2725,7 +2750,7 @@ class MapGetPipe {
2725
2750
  return val[key];
2726
2751
  }
2727
2752
  }
2728
- MapGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2753
+ MapGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2729
2754
  MapGetPipe.decorators = [
2730
2755
  { type: Pipe, args: [{
2731
2756
  name: 'mapGet'
@@ -2739,7 +2764,7 @@ class MapKeysPipe {
2739
2764
  return Object.keys(map);
2740
2765
  }
2741
2766
  }
2742
- MapKeysPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2767
+ MapKeysPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2743
2768
  MapKeysPipe.decorators = [
2744
2769
  { type: Pipe, args: [{
2745
2770
  name: 'mapKeys'
@@ -2753,7 +2778,7 @@ class MapValuesPipe {
2753
2778
  return Object.values(map);
2754
2779
  }
2755
2780
  }
2756
- MapValuesPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2781
+ MapValuesPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2757
2782
  MapValuesPipe.decorators = [
2758
2783
  { type: Pipe, args: [{
2759
2784
  name: 'mapValues'
@@ -2881,7 +2906,7 @@ class TranslateContextService {
2881
2906
  return translations[keys[keys.length - 1]]; // Return the last keys translation
2882
2907
  }
2883
2908
  }
2884
- TranslateContextService.ɵprov = ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(ɵɵinject(TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2909
+ TranslateContextService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(i0.ɵɵinject(i1$1.TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2885
2910
  TranslateContextService.decorators = [
2886
2911
  { type: Injectable, args: [{ providedIn: 'root' },] }
2887
2912
  ];
@@ -2939,7 +2964,7 @@ NgInitDirective.propDecorators = {
2939
2964
  ngInit: [{ type: Output }]
2940
2965
  };
2941
2966
 
2942
- const moment$2 = momentImported;
2967
+ const moment$8 = momentImported;
2943
2968
  // @dynamic
2944
2969
  class SharedValidators {
2945
2970
  static getDoubleRegexp(maxDecimals) {
@@ -3020,7 +3045,7 @@ class SharedValidators {
3020
3045
  }
3021
3046
  static validDate(control) {
3022
3047
  const value = control.value;
3023
- const date = !value || moment$2.isMoment(value) ? value : moment$2(value, DATE_ISO_PATTERN);
3048
+ const date = !value || moment$8.isMoment(value) ? value : moment$8(value, DATE_ISO_PATTERN);
3024
3049
  if (date && (!date.isValid() || date.year() < 1970)) {
3025
3050
  return { validDate: true };
3026
3051
  }
@@ -4145,7 +4170,7 @@ class FormErrorTranslator {
4145
4170
  return errorKey;
4146
4171
  }
4147
4172
  }
4148
- FormErrorTranslator.ɵprov = ɵɵdefineInjectable({ factory: function FormErrorTranslator_Factory() { return new FormErrorTranslator(ɵɵinject(TranslateService), ɵɵinject(APP_FORM_ERROR_I18N_KEYS, 8)); }, token: FormErrorTranslator, providedIn: "root" });
4173
+ 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
4174
  FormErrorTranslator.decorators = [
4150
4175
  { type: Injectable, args: [{ providedIn: 'root' },] }
4151
4176
  ];
@@ -4407,7 +4432,7 @@ class PropertyFormatPipe {
4407
4432
  return this._i18nNo;
4408
4433
  }
4409
4434
  }
4410
- PropertyFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function PropertyFormatPipe_Factory() { return new PropertyFormatPipe(ɵɵinject(DateFormatPipe), ɵɵinject(TranslateService)); }, token: PropertyFormatPipe, providedIn: "root" });
4435
+ PropertyFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PropertyFormatPipe_Factory() { return new PropertyFormatPipe(i0.ɵɵinject(DateFormatPipe), i0.ɵɵinject(i1$1.TranslateService)); }, token: PropertyFormatPipe, providedIn: "root" });
4411
4436
  PropertyFormatPipe.decorators = [
4412
4437
  { type: Pipe, args: [{
4413
4438
  name: 'propertyFormat'
@@ -4773,9 +4798,9 @@ function parseDuration(input, maxDecimals, placeholderChar) {
4773
4798
  const hour = parseInt(durationParts[0] || '0');
4774
4799
  const minute = parseInt(durationParts[1] || '0');
4775
4800
  const value = hour + (minute + 0.5) / 60;
4776
- return roundFloat$1(value, maxDecimals);
4801
+ return roundFloat(value, maxDecimals);
4777
4802
  }
4778
- function roundFloat$1(input, maxDecimals) {
4803
+ function roundFloat(input, maxDecimals) {
4779
4804
  if (maxDecimals > 0) {
4780
4805
  const powDecimal = Math.pow(10, maxDecimals);
4781
4806
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -4799,16 +4824,16 @@ const MASKS = {
4799
4824
  DD: [/[+-]/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '°']
4800
4825
  }
4801
4826
  };
4802
- const noop$1 = () => {
4827
+ const noop$7 = () => {
4803
4828
  };
4804
- const ɵ0$2 = noop$1;
4829
+ const ɵ0$a = noop$7;
4805
4830
  class MatLatLongField {
4806
4831
  constructor(formBuilder, cd, formGroupDir) {
4807
4832
  this.formBuilder = formBuilder;
4808
4833
  this.cd = cd;
4809
4834
  this.formGroupDir = formGroupDir;
4810
- this._onChangeCallback = noop$1;
4811
- this._onTouchedCallback = noop$1;
4835
+ this._onChangeCallback = noop$7;
4836
+ this._onTouchedCallback = noop$7;
4812
4837
  this._subscription = new Subscription();
4813
4838
  this._disabling = false;
4814
4839
  this._writing = false;
@@ -5153,14 +5178,14 @@ SharedMatLatLongModule.decorators = [
5153
5178
  },] }
5154
5179
  ];
5155
5180
 
5156
- const DEFAULT_VALUE_ACCESSOR = {
5181
+ const DEFAULT_VALUE_ACCESSOR$5 = {
5157
5182
  provide: NG_VALUE_ACCESSOR,
5158
5183
  useExisting: forwardRef(() => MatDate),
5159
5184
  multi: true
5160
5185
  };
5161
5186
  const TEXT_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5162
- const noop$2 = () => { };
5163
- const ɵ0$3 = noop$2;
5187
+ const noop$6 = () => { };
5188
+ const ɵ0$9 = noop$6;
5164
5189
  class MatDate {
5165
5190
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5166
5191
  this.dateAdapter = dateAdapter;
@@ -5169,8 +5194,8 @@ class MatDate {
5169
5194
  this.cd = cd;
5170
5195
  this.keyboard = keyboard;
5171
5196
  this.formGroupDir = formGroupDir;
5172
- this._onChangeCallback = noop$2;
5173
- this._onTouchedCallback = noop$2;
5197
+ this._onChangeCallback = noop$6;
5198
+ this._onTouchedCallback = noop$6;
5174
5199
  this._subscription = new Subscription();
5175
5200
  this._writing = true;
5176
5201
  this._disabling = false;
@@ -5476,7 +5501,7 @@ MatDate.decorators = [
5476
5501
  selector: 'mat-date-field',
5477
5502
  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
5503
  providers: [
5479
- DEFAULT_VALUE_ACCESSOR,
5504
+ DEFAULT_VALUE_ACCESSOR$5,
5480
5505
  ],
5481
5506
  changeDetection: ChangeDetectionStrategy.OnPush,
5482
5507
  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 +5536,16 @@ MatDate.propDecorators = {
5511
5536
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5512
5537
  };
5513
5538
 
5514
- const DEFAULT_VALUE_ACCESSOR$1 = {
5539
+ const DEFAULT_VALUE_ACCESSOR$4 = {
5515
5540
  provide: NG_VALUE_ACCESSOR,
5516
5541
  useExisting: forwardRef(() => MatDateTime),
5517
5542
  multi: true
5518
5543
  };
5519
- const DAY_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5544
+ const DAY_MASK$1 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5520
5545
  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;
5546
+ const HOUR_MASK$1 = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5547
+ const noop$5 = () => { };
5548
+ const ɵ0$8 = noop$5;
5524
5549
  class MatDateTime {
5525
5550
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5526
5551
  this.dateAdapter = dateAdapter;
@@ -5529,14 +5554,14 @@ class MatDateTime {
5529
5554
  this.cd = cd;
5530
5555
  this.keyboard = keyboard;
5531
5556
  this.formGroupDir = formGroupDir;
5532
- this._onChangeCallback = noop$3;
5533
- this._onTouchedCallback = noop$3;
5557
+ this._onChangeCallback = noop$5;
5558
+ this._onTouchedCallback = noop$5;
5534
5559
  this._subscription = new Subscription();
5535
5560
  this._writing = true;
5536
5561
  this._disabling = false;
5537
5562
  this._readonly = false;
5538
- this.dayMask = DAY_MASK;
5539
- this.hourMask = HOUR_MASK;
5563
+ this.dayMask = DAY_MASK$1;
5564
+ this.hourMask = HOUR_MASK$1;
5540
5565
  this.floatLabel = 'auto';
5541
5566
  this.compact = false;
5542
5567
  this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
@@ -5857,7 +5882,7 @@ MatDateTime.decorators = [
5857
5882
  selector: 'mat-date-time-field',
5858
5883
  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
5884
  providers: [
5860
- DEFAULT_VALUE_ACCESSOR$1,
5885
+ DEFAULT_VALUE_ACCESSOR$4,
5861
5886
  ],
5862
5887
  changeDetection: ChangeDetectionStrategy.OnPush,
5863
5888
  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 +5917,15 @@ MatDateTime.propDecorators = {
5892
5917
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5893
5918
  };
5894
5919
 
5895
- const DEFAULT_VALUE_ACCESSOR$2 = {
5920
+ const DEFAULT_VALUE_ACCESSOR$3 = {
5896
5921
  provide: NG_VALUE_ACCESSOR,
5897
5922
  useExisting: forwardRef(() => MatDateShort),
5898
5923
  multi: true
5899
5924
  };
5900
- const DAY_MASK$1 = [/\d/, /\d/, /\d/, /\d/];
5925
+ const DAY_MASK = [/\d/, /\d/, /\d/, /\d/];
5901
5926
  const noop$4 = () => {
5902
5927
  };
5903
- const ɵ0$5 = noop$4;
5928
+ const ɵ0$7 = noop$4;
5904
5929
  class MatDateShort {
5905
5930
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5906
5931
  this.dateAdapter = dateAdapter;
@@ -5913,7 +5938,7 @@ class MatDateShort {
5913
5938
  this._onTouchedCallback = noop$4;
5914
5939
  this.writing = true;
5915
5940
  this.disabling = false;
5916
- this.dayMask = DAY_MASK$1;
5941
+ this.dayMask = DAY_MASK;
5917
5942
  this.disabled = false;
5918
5943
  this.floatLabel = 'auto';
5919
5944
  this.readonly = false;
@@ -6158,7 +6183,7 @@ MatDateShort.decorators = [
6158
6183
  selector: 'mat-date-short-field',
6159
6184
  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
6185
  providers: [
6161
- DEFAULT_VALUE_ACCESSOR$2,
6186
+ DEFAULT_VALUE_ACCESSOR$3,
6162
6187
  ],
6163
6188
  changeDetection: ChangeDetectionStrategy.OnPush,
6164
6189
  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 +6252,16 @@ SharedMatDateTimeModule.decorators = [
6227
6252
  },] }
6228
6253
  ];
6229
6254
 
6230
- const DEFAULT_VALUE_ACCESSOR$3 = {
6255
+ const DEFAULT_VALUE_ACCESSOR$2 = {
6231
6256
  provide: NG_VALUE_ACCESSOR,
6232
6257
  useExisting: forwardRef(() => MatDuration),
6233
6258
  multi: true
6234
6259
  };
6235
6260
  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 = () => {
6261
+ const HOUR_MASK = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
6262
+ const noop$3 = () => {
6238
6263
  };
6239
- const ɵ0$6 = noop$5;
6264
+ const ɵ0$6 = noop$3;
6240
6265
  class MatDuration {
6241
6266
  constructor(platform, dateAdapter, translate, formBuilder, cd, formGroupDir) {
6242
6267
  this.dateAdapter = dateAdapter;
@@ -6245,11 +6270,11 @@ class MatDuration {
6245
6270
  this.cd = cd;
6246
6271
  this.formGroupDir = formGroupDir;
6247
6272
  this._subscription = new Subscription();
6248
- this._onChangeCallback = noop$5;
6249
- this._onTouchedCallback = noop$5;
6273
+ this._onChangeCallback = noop$3;
6274
+ this._onTouchedCallback = noop$3;
6250
6275
  this.writing = true;
6251
6276
  this.disabling = false;
6252
- this.hourMask = HOUR_MASK$1;
6277
+ this.hourMask = HOUR_MASK;
6253
6278
  this.disabled = false;
6254
6279
  this.floatLabel = 'auto';
6255
6280
  this.readonly = false;
@@ -6429,7 +6454,7 @@ MatDuration.decorators = [
6429
6454
  selector: 'mat-duration-field',
6430
6455
  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
6456
  providers: [
6432
- DEFAULT_VALUE_ACCESSOR$3,
6457
+ DEFAULT_VALUE_ACCESSOR$2,
6433
6458
  ],
6434
6459
  changeDetection: ChangeDetectionStrategy.OnPush,
6435
6460
  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 +6512,22 @@ SharedMatDurationModule.decorators = [
6487
6512
  },] }
6488
6513
  ];
6489
6514
 
6490
- const DEFAULT_VALUE_ACCESSOR$4 = {
6515
+ const DEFAULT_VALUE_ACCESSOR$1 = {
6491
6516
  provide: NG_VALUE_ACCESSOR,
6492
6517
  useExisting: forwardRef(() => MatBooleanField),
6493
6518
  multi: true
6494
6519
  };
6495
- const noop$6 = () => {
6520
+ const noop$2 = () => {
6496
6521
  };
6497
- const ɵ0$7 = noop$6;
6522
+ const ɵ0$5 = noop$2;
6498
6523
  class MatBooleanField {
6499
6524
  constructor(translate, formBuilder, cd, formGroupDir) {
6500
6525
  this.translate = translate;
6501
6526
  this.formBuilder = formBuilder;
6502
6527
  this.cd = cd;
6503
6528
  this.formGroupDir = formGroupDir;
6504
- this._onChangeCallback = noop$6;
6505
- this._onTouchedCallback = noop$6;
6529
+ this._onChangeCallback = noop$2;
6530
+ this._onTouchedCallback = noop$2;
6506
6531
  this._writing = false;
6507
6532
  this.showRadio = false;
6508
6533
  this.disabled = false;
@@ -6665,7 +6690,7 @@ MatBooleanField.decorators = [
6665
6690
  selector: 'mat-boolean-field',
6666
6691
  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
6692
  providers: [
6668
- DEFAULT_VALUE_ACCESSOR$4
6693
+ DEFAULT_VALUE_ACCESSOR$1
6669
6694
  ],
6670
6695
  changeDetection: ChangeDetectionStrategy.OnPush,
6671
6696
  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 +6937,7 @@ class MatNumpadDomService {
6912
6937
  this.appRef.detachView(this.componentRef.hostView);
6913
6938
  }
6914
6939
  }
6915
- MatNumpadDomService.ɵprov = ɵɵdefineInjectable({ factory: function MatNumpadDomService_Factory() { return new MatNumpadDomService(ɵɵinject(ComponentFactoryResolver), ɵɵinject(ApplicationRef), ɵɵinject(INJECTOR), ɵɵinject(DOCUMENT, 8)); }, token: MatNumpadDomService, providedIn: "root" });
6940
+ 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
6941
  MatNumpadDomService.decorators = [
6917
6942
  { type: Injectable, args: [{
6918
6943
  providedIn: 'root'
@@ -7276,7 +7301,7 @@ SharedMatNumpadModule.decorators = [
7276
7301
  },] }
7277
7302
  ];
7278
7303
 
7279
- const DEFAULT_VALUE_ACCESSOR$5 = {
7304
+ const DEFAULT_VALUE_ACCESSOR = {
7280
7305
  provide: NG_VALUE_ACCESSOR,
7281
7306
  useExisting: forwardRef(() => MatSwipeField),
7282
7307
  multi: true
@@ -7539,7 +7564,7 @@ MatSwipeField.decorators = [
7539
7564
  { type: Component, args: [{
7540
7565
  selector: 'mat-swipe-field',
7541
7566
  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],
7567
+ providers: [DEFAULT_VALUE_ACCESSOR],
7543
7568
  changeDetection: ChangeDetectionStrategy.OnPush,
7544
7569
  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
7570
  },] }
@@ -7598,14 +7623,14 @@ SharedMatSwipeModule.decorators = [
7598
7623
  },] }
7599
7624
  ];
7600
7625
 
7601
- const noop$7 = () => { };
7602
- const ɵ0$8 = noop$7;
7626
+ const noop$1 = () => { };
7627
+ const ɵ0$4 = noop$1;
7603
7628
  class MatChipsField {
7604
7629
  constructor(cd, formGroupDir) {
7605
7630
  this.cd = cd;
7606
7631
  this.formGroupDir = formGroupDir;
7607
- this._onChangeCallback = noop$7;
7608
- this._onTouchedCallback = noop$7;
7632
+ this._onChangeCallback = noop$1;
7633
+ this._onTouchedCallback = noop$1;
7609
7634
  this.logPrefix = '[mat-chips] ';
7610
7635
  this.formControlName = null;
7611
7636
  this.required = false;
@@ -8477,7 +8502,7 @@ class ProgressBarService {
8477
8502
  }
8478
8503
  }
8479
8504
  }
8480
- ProgressBarService.ɵprov = ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8505
+ ProgressBarService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8481
8506
  ProgressBarService.decorators = [
8482
8507
  { type: Injectable, args: [{ providedIn: 'root' },] }
8483
8508
  ];
@@ -8521,7 +8546,7 @@ class AppGestureConfig extends HammerGestureConfig {
8521
8546
  return mc;
8522
8547
  }
8523
8548
  }
8524
- AppGestureConfig.ɵprov = ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8549
+ AppGestureConfig.ɵprov = i0.ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8525
8550
  AppGestureConfig.decorators = [
8526
8551
  { type: Injectable, args: [{ providedIn: 'root' },] }
8527
8552
  ];
@@ -8762,7 +8787,7 @@ class MatPaginatorI18n extends MatPaginatorIntl {
8762
8787
  this.previousPageLabel = this.translate.instant('COMMON.PAGINATOR.PREVIOUS_PAGE');
8763
8788
  }
8764
8789
  }
8765
- MatPaginatorI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(ɵɵinject(TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8790
+ MatPaginatorI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8766
8791
  MatPaginatorI18n.decorators = [
8767
8792
  { type: Injectable, args: [{ providedIn: 'root' },] }
8768
8793
  ];
@@ -8852,17 +8877,17 @@ function getColorContrast(color, bw) {
8852
8877
  return rgbArrayToHex(rgb.map(v => 255 - v));
8853
8878
  }
8854
8879
 
8855
- const noop$8 = () => {
8880
+ const noop = () => {
8856
8881
  };
8857
- const ɵ0$9 = noop$8;
8882
+ const ɵ0$3 = noop;
8858
8883
  class AppFormField {
8859
8884
  constructor(translate, cd, injector, formGroupDir) {
8860
8885
  this.translate = translate;
8861
8886
  this.cd = cd;
8862
8887
  this.injector = injector;
8863
8888
  this.formGroupDir = formGroupDir;
8864
- this._onChangeCallback = noop$8;
8865
- this._onTouchedCallback = noop$8;
8889
+ this._onChangeCallback = noop;
8890
+ this._onTouchedCallback = noop;
8866
8891
  this.readonly = false;
8867
8892
  this.compact = false;
8868
8893
  this.floatLabel = 'auto';
@@ -9298,14 +9323,14 @@ class AudioProvider extends StartableService {
9298
9323
  });
9299
9324
  }
9300
9325
  }
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" });
9326
+ 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
9327
  AudioProvider.decorators = [
9303
9328
  { type: Injectable, args: [{ providedIn: 'root' },] }
9304
9329
  ];
9305
9330
  AudioProvider.ctorParameters = () => [
9306
9331
  { type: Platform },
9307
- { type: NativeAudio$1, decorators: [{ type: Optional }] },
9308
- { type: Vibration$1, decorators: [{ type: Optional }] },
9332
+ { type: NativeAudio, decorators: [{ type: Optional }] },
9333
+ { type: Vibration, decorators: [{ type: Optional }] },
9309
9334
  { type: AudioManagement, decorators: [{ type: Optional }] }
9310
9335
  ];
9311
9336
 
@@ -9390,7 +9415,7 @@ class Hotkeys {
9390
9415
  });
9391
9416
  }
9392
9417
  }
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" });
9418
+ 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
9419
  Hotkeys.decorators = [
9395
9420
  { type: Injectable, args: [{
9396
9421
  providedIn: 'root'
@@ -9604,7 +9629,7 @@ class ImagesUtils {
9604
9629
  }
9605
9630
  }
9606
9631
 
9607
- const uuidv4 = uuidv4Imported;
9632
+ const uuidv4$1 = uuidv4Imported;
9608
9633
  class FileService {
9609
9634
  constructor(platform,
9610
9635
  //private transfer: FileTransfer,
@@ -9641,7 +9666,7 @@ class FileService {
9641
9666
  const lastSlashIndex = fileUrl.lastIndexOf('/');
9642
9667
  if (lastSlashIndex === -1)
9643
9668
  throw new Error('Invalid URL: ' + fileUrl);
9644
- const fileName = lastSlashIndex < (fileUrl.length - 1) && fileUrl.substring(lastSlashIndex + 1) || uuidv4();
9669
+ const fileName = lastSlashIndex < (fileUrl.length - 1) && fileUrl.substring(lastSlashIndex + 1) || uuidv4$1();
9645
9670
  // Download into the file system
9646
9671
  if (outputType === 'fileUrl' && this.canUseFileSystem) {
9647
9672
  console.warn(`WARN: [file] Downloading image {${fileUrl}} in local filesystem...`);
@@ -9697,7 +9722,7 @@ class FileService {
9697
9722
  this._started = true;
9698
9723
  }
9699
9724
  }
9700
- FileService.ɵprov = ɵɵdefineInjectable({ factory: function FileService_Factory() { return new FileService(ɵɵinject(Platform), ɵɵinject(HttpClient), ɵɵinject(ENVIRONMENT)); }, token: FileService, providedIn: "root" });
9725
+ 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
9726
  FileService.decorators = [
9702
9727
  { type: Injectable, args: [{
9703
9728
  providedIn: 'root',
@@ -9863,7 +9888,7 @@ class Base58 {
9863
9888
  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
9864
9889
 
9865
9890
  const scrypt = require('scrypt-async');
9866
- const sha256 = require('hash.js/lib/hash/sha/256');
9891
+ const sha256$1 = require('hash.js/lib/hash/sha/256');
9867
9892
  const sha512 = require('hash.js/lib/hash/sha/512');
9868
9893
  const nacl = {
9869
9894
  sign,
@@ -9967,7 +9992,7 @@ class CryptoService {
9967
9992
  * Hash (using SHA256) a message
9968
9993
  */
9969
9994
  sha256(message) {
9970
- return sha256().update(message).digest('hex');
9995
+ return sha256$1().update(message).digest('hex');
9971
9996
  }
9972
9997
  /**
9973
9998
  * Hash (using SHA512) a message
@@ -9980,7 +10005,7 @@ class CryptoService {
9980
10005
  return nacl.util.encodeBase64(m);
9981
10006
  }
9982
10007
  }
9983
- CryptoService.ɵprov = ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
10008
+ CryptoService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
9984
10009
  CryptoService.decorators = [
9985
10010
  { type: Injectable, args: [{ providedIn: 'root' },] }
9986
10011
  ];
@@ -10742,7 +10767,7 @@ SelectPeerModal.propDecorators = {
10742
10767
  onRefresh: [{ type: Input }]
10743
10768
  };
10744
10769
 
10745
- const moment$3 = momentImported;
10770
+ const moment$7 = momentImported;
10746
10771
  const SETTINGS_STORAGE_KEY = 'settings';
10747
10772
  const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
10748
10773
  // fixme: this constant points to static environment
@@ -10791,7 +10816,7 @@ class LocalSettingsService extends StartableService {
10791
10816
  var _a;
10792
10817
  if (isNil((_a = this._data) === null || _a === void 0 ? void 0 : _a.mobile)) {
10793
10818
  console.warn("[settings] Accessing to property 'mobile' BEFORE service started! Please use ready()");
10794
- return isMobile(window);
10819
+ this._data.mobile = isMobile(window);
10795
10820
  }
10796
10821
  return this._data.mobile;
10797
10822
  }
@@ -10985,11 +11010,11 @@ class LocalSettingsService extends StartableService {
10985
11010
  if (!feature) {
10986
11011
  feature = {
10987
11012
  name: featureName.toLowerCase(),
10988
- lastSyncDate: moment$3().toISOString()
11013
+ lastSyncDate: moment$7().toISOString()
10989
11014
  };
10990
11015
  }
10991
11016
  else {
10992
- feature.lastSyncDate = moment$3().toISOString();
11017
+ feature.lastSyncDate = moment$7().toISOString();
10993
11018
  }
10994
11019
  this.saveOfflineFeature(feature);
10995
11020
  }
@@ -11150,7 +11175,7 @@ class LocalSettingsService extends StartableService {
11150
11175
  if (!page || !page.title || !page.path)
11151
11176
  throw Error('Missing required argument \'page\', \'page.path\' or \'page.title\'');
11152
11177
  // Set time
11153
- page.time = page.time || moment$3();
11178
+ page.time = page.time || moment$7();
11154
11179
  // Clean the title (remove <small> tags)
11155
11180
  if (!opts || opts.removeTitleSmallTag !== false) {
11156
11181
  const tagIndex = page.title.indexOf('</small>');
@@ -11166,7 +11191,7 @@ class LocalSettingsService extends StartableService {
11166
11191
  return page;
11167
11192
  }
11168
11193
  }
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" });
11194
+ 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
11195
  LocalSettingsService.decorators = [
11171
11196
  { type: Injectable, args: [{
11172
11197
  providedIn: 'root'
@@ -11883,7 +11908,7 @@ class NetworkService extends StartableService {
11883
11908
  });
11884
11909
  }
11885
11910
  }
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" });
11911
+ 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
11912
  NetworkService.decorators = [
11888
11913
  { type: Injectable, args: [{ providedIn: 'root' },] }
11889
11914
  ];
@@ -11894,11 +11919,11 @@ NetworkService.ctorParameters = () => [
11894
11919
  { type: CryptoService },
11895
11920
  { type: Storage },
11896
11921
  { type: LocalSettingsService },
11897
- { type: CacheService$1 },
11922
+ { type: CacheService },
11898
11923
  { type: HttpClient },
11899
11924
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
11900
- { type: Network$1, decorators: [{ type: Optional }] },
11901
- { type: SplashScreen$1, decorators: [{ type: Optional }] },
11925
+ { type: Network, decorators: [{ type: Optional }] },
11926
+ { type: SplashScreen, decorators: [{ type: Optional }] },
11902
11927
  { type: TranslateService, decorators: [{ type: Optional }] },
11903
11928
  { type: ToastController, decorators: [{ type: Optional }] }
11904
11929
  ];
@@ -12829,7 +12854,7 @@ class EntitiesStorage extends StartableService {
12829
12854
  }
12830
12855
  EntitiesStorage.TRASH_PREFIX = 'Trash#';
12831
12856
  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" });
12857
+ 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
12858
  EntitiesStorage.decorators = [
12834
12859
  { type: Injectable, args: [{ providedIn: 'root' },] }
12835
12860
  ];
@@ -12966,10 +12991,10 @@ function referentialToString(obj, properties) {
12966
12991
  function referentialsToString(values, properties, separator) {
12967
12992
  return (values || []).map(v => referentialToString(v, properties)).join(separator || ', ');
12968
12993
  }
12969
- const ɵ0$a = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12994
+ const ɵ0$2 = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12970
12995
  const StatusList = Object.freeze([
12971
12996
  {
12972
- id: ɵ0$a,
12997
+ id: ɵ0$2,
12973
12998
  icon: 'checkmark',
12974
12999
  label: 'REFERENTIAL.STATUS_ENUM.ENABLE'
12975
13000
  },
@@ -13244,7 +13269,7 @@ function accountToString(data) {
13244
13269
  (data.lastName || '')) || '';
13245
13270
  }
13246
13271
 
13247
- const uuidv4$1 = uuidv4Imported;
13272
+ const uuidv4 = uuidv4Imported;
13248
13273
  const _global = typeof global !== 'undefined' ? global : (typeof window !== 'undefined' ? window : {});
13249
13274
  const NativeWebSocket = _global.WebSocket || _global.MozWebSocket;
13250
13275
  /**
@@ -13288,7 +13313,7 @@ function createTrackerLink(opts) {
13288
13313
  // Skip if not tracked
13289
13314
  if (!context || !context.tracked)
13290
13315
  return forward(operation);
13291
- const id = context.serializationKey || uuidv4$1();
13316
+ const id = context.serializationKey || uuidv4();
13292
13317
  console.debug(`[apollo-tracker-link] Watching tracked query {${operation.operationName}#${id}}`);
13293
13318
  // Clean context, before calling JSON.stringify (remove unused attributes)
13294
13319
  const cleanContext = Object.assign(Object.assign({}, context), { optimisticResponse: null, cache: null });
@@ -14028,7 +14053,7 @@ class GraphqlService extends StartableService {
14028
14053
  return undefined;
14029
14054
  }
14030
14055
  }
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" });
14056
+ 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
14057
  GraphqlService.decorators = [
14033
14058
  { type: Injectable, args: [{
14034
14059
  providedIn: 'root'
@@ -14045,7 +14070,7 @@ GraphqlService.ctorParameters = () => [
14045
14070
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_GRAPHQL_TYPE_POLICIES,] }] }
14046
14071
  ];
14047
14072
 
14048
- const sha256$1 = require('hash.js/lib/hash/sha/256');
14073
+ const sha256 = require('hash.js/lib/hash/sha/256');
14049
14074
  class BaseGraphqlServiceOptions {
14050
14075
  }
14051
14076
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
@@ -14196,8 +14221,8 @@ class BaseGraphqlService extends StartableService {
14196
14221
  }
14197
14222
  /* -- protected methods -- */
14198
14223
  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) || '';
14224
+ const queryName = opts.queryName || sha256().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
14225
+ const variablesKey = opts.variables && sha256().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
14201
14226
  return [queryName, opts.arrayFieldName, variablesKey].join('|');
14202
14227
  }
14203
14228
  findMutableWatchQueries(opts) {
@@ -14267,7 +14292,7 @@ const DEFAULT_AVATAR_IMAGE = 'assets/img/person.png';
14267
14292
  /* ------------------------------------
14268
14293
  * GraphQL queries
14269
14294
  * ------------------------------------*/
14270
- const Fragments = {
14295
+ const Fragments$1 = {
14271
14296
  account: gql `
14272
14297
  fragment AccountFragment on AccountVO {
14273
14298
  id
@@ -14302,14 +14327,14 @@ const Fragments = {
14302
14327
  }`
14303
14328
  };
14304
14329
  // Load account query
14305
- const LoadQuery = gql `
14330
+ const LoadQuery$1 = gql `
14306
14331
  query Account {
14307
14332
  data: account {
14308
14333
  ...AccountFragment
14309
14334
  }
14310
14335
  }
14311
- ${Fragments.account}
14312
- ${Fragments.settings}
14336
+ ${Fragments$1.account}
14337
+ ${Fragments$1.settings}
14313
14338
  `;
14314
14339
  // Check email query
14315
14340
  const IsEmailExistsQuery = gql `
@@ -14324,21 +14349,21 @@ const AccountMutations = {
14324
14349
  ...AccountFragment
14325
14350
  }
14326
14351
  }
14327
- ${Fragments.account}
14328
- ${Fragments.settings}`,
14352
+ ${Fragments$1.account}
14353
+ ${Fragments$1.settings}`,
14329
14354
  create: gql `mutation CreateAccount($data:AccountVOInput){
14330
14355
  data: createAccount(account: $data){
14331
14356
  ...AccountFragment
14332
14357
  }
14333
14358
  }
14334
- ${Fragments.account}
14335
- ${Fragments.settings}`,
14359
+ ${Fragments$1.account}
14360
+ ${Fragments$1.settings}`,
14336
14361
  saveSettings: gql `mutation SaveSettings($data:UserSettingsVOInput){
14337
14362
  data: saveSettings(settings: $data){
14338
14363
  ...UserSettingsFragment
14339
14364
  }
14340
14365
  }
14341
- ${Fragments.settings}`
14366
+ ${Fragments$1.settings}`
14342
14367
  };
14343
14368
  // Sent confirmation email
14344
14369
  const SendConfirmEmailMutation = gql `
@@ -14849,7 +14874,7 @@ class AccountService extends BaseGraphqlService {
14849
14874
  // Load remotely
14850
14875
  else {
14851
14876
  const { data } = yield this.graphql.query({
14852
- query: LoadQuery,
14877
+ query: LoadQuery$1,
14853
14878
  error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
14854
14879
  fetchPolicy: opts && opts.fetchPolicy || 'no-cache' || undefined
14855
14880
  });
@@ -15372,7 +15397,7 @@ class AccountService extends BaseGraphqlService {
15372
15397
  return Toasts.show(this.toastController, this.translate, opts);
15373
15398
  }
15374
15399
  }
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" });
15400
+ 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
15401
  AccountService.decorators = [
15377
15402
  { type: Injectable, args: [{ providedIn: 'root', deps: [ENVIRONMENT] },] }
15378
15403
  ];
@@ -15640,7 +15665,7 @@ const CONFIGURATION_STORAGE_KEY = 'configuration';
15640
15665
  /* ------------------------------------
15641
15666
  * GraphQL queries
15642
15667
  * ------------------------------------*/
15643
- const Fragments$1 = {
15668
+ const Fragments = {
15644
15669
  config: gql `
15645
15670
  fragment ConfigFragment on ConfigurationVO {
15646
15671
  id
@@ -15667,13 +15692,13 @@ const Fragments$1 = {
15667
15692
  }
15668
15693
  `
15669
15694
  };
15670
- const LoadQuery$1 = gql `
15695
+ const LoadQuery = gql `
15671
15696
  query Configuration{
15672
15697
  data: configuration{
15673
15698
  ...ConfigFragment
15674
15699
  }
15675
15700
  }
15676
- ${Fragments$1.config}
15701
+ ${Fragments.config}
15677
15702
  `;
15678
15703
  // Save (create or update) account mutation
15679
15704
  const SaveMutation = gql `
@@ -15682,7 +15707,7 @@ const SaveMutation = gql `
15682
15707
  ...ConfigFragment
15683
15708
  }
15684
15709
  }
15685
- ${Fragments$1.config}
15710
+ ${Fragments.config}
15686
15711
  `;
15687
15712
  const ClearCache = gql `
15688
15713
  query ClearCache($name: String) {
@@ -15733,7 +15758,7 @@ class ConfigService extends BaseGraphqlService {
15733
15758
  return __awaiter(this, void 0, void 0, function* () {
15734
15759
  const now = Date.now();
15735
15760
  console.debug('[config] Loading Pod configuration...');
15736
- const query = opts && opts.query || LoadQuery$1;
15761
+ const query = opts && opts.query || LoadQuery;
15737
15762
  const variables = opts && opts.variables || undefined;
15738
15763
  const res = yield this.graphql.query({
15739
15764
  query,
@@ -15972,7 +15997,7 @@ class ConfigService extends BaseGraphqlService {
15972
15997
  });
15973
15998
  }
15974
15999
  }
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" });
16000
+ 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
16001
  ConfigService.decorators = [
15977
16002
  { type: Injectable, args: [{
15978
16003
  providedIn: 'root',
@@ -16218,7 +16243,7 @@ class UriUtils {
16218
16243
  }
16219
16244
  }
16220
16245
 
16221
- const moment$4 = momentImported;
16246
+ const moment$6 = momentImported;
16222
16247
  const AndroidOsEnvironment = Object.freeze({
16223
16248
  DIRECTORY_DOWNLOADS: 'Download',
16224
16249
  DIRECTORY_DOWNLOADS_OLD: 'Downloads',
@@ -16253,6 +16278,8 @@ class PlatformService extends StartableService {
16253
16278
  is(platformName) {
16254
16279
  switch (platformName) {
16255
16280
  case 'mobile':
16281
+ // Exclude Windows touch screens - see sumaris-app issues #323 and #346
16282
+ return isMobile(window);
16256
16283
  case 'mobileweb':
16257
16284
  // Exclude Windows touch screens - see sumaris-app issues #323 and #346
16258
16285
  return this.platform.is(platformName) && !isWindows(window);
@@ -16479,16 +16506,16 @@ class PlatformService extends StartableService {
16479
16506
  }
16480
16507
  // config moment lib
16481
16508
  try {
16482
- moment$4.locale(event.lang);
16509
+ moment$6.locale(event.lang);
16483
16510
  console.debug('[platform] Use locale {' + event.lang + '}');
16484
16511
  }
16485
16512
  // If error, fallback to en
16486
16513
  catch (err) {
16487
- moment$4.locale('en');
16514
+ moment$6.locale('en');
16488
16515
  console.warn('[platform] Unknown local for moment lib. Using default [en]');
16489
16516
  }
16490
16517
  // Config date adapter
16491
- this.dateAdapter.setLocale(moment$4.locale());
16518
+ this.dateAdapter.setLocale(moment$6.locale());
16492
16519
  }
16493
16520
  });
16494
16521
  this.settings.onChange.subscribe(data => {
@@ -16688,7 +16715,7 @@ class PlatformService extends StartableService {
16688
16715
  });
16689
16716
  }
16690
16717
  }
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" });
16718
+ 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
16719
  PlatformService.decorators = [
16693
16720
  { type: Injectable, args: [{ providedIn: 'root' },] }
16694
16721
  ];
@@ -16703,15 +16730,15 @@ PlatformService.ctorParameters = () => [
16703
16730
  { type: NetworkService },
16704
16731
  { type: AccountService },
16705
16732
  { type: ConfigService },
16706
- { type: CacheService$1 },
16733
+ { type: CacheService },
16707
16734
  { type: Storage },
16708
16735
  { type: AudioProvider },
16709
16736
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
16710
- { type: StatusBar$1, decorators: [{ type: Optional }] },
16737
+ { type: StatusBar, decorators: [{ type: Optional }] },
16711
16738
  { 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 }] }
16739
+ { type: SplashScreen, decorators: [{ type: Optional }] },
16740
+ { type: InAppBrowser, decorators: [{ type: Optional }] },
16741
+ { type: Downloader, decorators: [{ type: Optional }] }
16715
16742
  ];
16716
16743
 
16717
16744
  class AppHelpModal {
@@ -16776,7 +16803,7 @@ class MatStepperI18n extends MatStepperIntl {
16776
16803
  this.optionalLabel = this.translate.instant('COMMON.OPTIONAL');
16777
16804
  }
16778
16805
  }
16779
- MatStepperI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(ɵɵinject(TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16806
+ MatStepperI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16780
16807
  MatStepperI18n.decorators = [
16781
16808
  { type: Injectable, args: [{ providedIn: 'root' },] }
16782
16809
  ];
@@ -18179,28 +18206,30 @@ class InMemoryEntitiesService extends EntitiesService {
18179
18206
  }
18180
18207
  this.dirty = false;
18181
18208
  }
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* () {
18209
+ loadAll(offset, size, sortBy, sortDirection, filter, opts) {
18210
+ return __awaiter(this, void 0, void 0, function* () {
18211
+ offset = offset >= 0 ? offset : 0;
18212
+ size = size >= 0 ? size : -1;
18213
+ if (!this.data) {
18214
+ console.warn('[memory-data-service] Waiting value to be set...');
18215
+ yield firstNotNilPromise(this._onChange);
18216
+ }
18217
+ // Wait end of saving
18218
+ if (this._saving)
18219
+ yield waitFor(() => !this._saving);
18190
18220
  const excludedDataByFilter = [];
18191
18221
  let excludedDataByPagination;
18192
18222
  try {
18193
- if (isEmptyArray(this.data)) {
18223
+ if (!this.data.length) {
18194
18224
  return { data: [], total: 0 };
18195
18225
  }
18196
18226
  // Apply sort
18197
18227
  let data = this._sortFn(this.data || [], sortBy, sortDirection);
18198
18228
  if (this._onLoad) {
18199
- const promiseOrData = this._onLoad(data);
18200
- data = ((promiseOrData instanceof Promise)) ? yield promiseOrData : promiseOrData;
18229
+ data = yield this._onLoad(data);
18201
18230
  }
18202
18231
  // Apply filter (will update hiddenData)
18203
- data = this.filter(data, filterData, excludedDataByFilter);
18232
+ data = this.filter(data, filter, excludedDataByFilter);
18204
18233
  // Compute the total length
18205
18234
  const total = data.length;
18206
18235
  // If page size=0 (e.g. only need total)
@@ -18242,13 +18271,37 @@ class InMemoryEntitiesService extends EntitiesService {
18242
18271
  if (data === this.data) {
18243
18272
  data = data.slice();
18244
18273
  }
18245
- return { data, total };
18274
+ const res = { data, total };
18275
+ const nextOffset = (offset || 0) + size;
18276
+ if (nextOffset < total) {
18277
+ res.fetchMore = () => this.loadAll(nextOffset, size, sortBy, sortDirection, filter, opts)
18278
+ .then(res => {
18279
+ var _a;
18280
+ // Update hidden data (remove new fetched item)
18281
+ if ((_a = res.data) === null || _a === void 0 ? void 0 : _a.length) {
18282
+ this._hiddenData = this._hiddenData.filter(item => !res.data.includes(item));
18283
+ }
18284
+ return res;
18285
+ });
18286
+ }
18287
+ return res;
18246
18288
  }
18247
18289
  finally {
18248
18290
  // Remember hidden data
18249
- this._hiddenData = !excludedDataByPagination ? excludedDataByFilter : excludedDataByFilter.concat(...excludedDataByPagination);
18291
+ if (offset === 0) {
18292
+ this._hiddenData = !excludedDataByPagination ? excludedDataByFilter : excludedDataByFilter.concat(...excludedDataByPagination);
18293
+ }
18250
18294
  }
18251
- })));
18295
+ });
18296
+ }
18297
+ watchAll(offset, size, sortBy, sortDirection, filterData, options) {
18298
+ offset = offset >= 0 ? offset : 0;
18299
+ size = size >= 0 ? size : -1;
18300
+ if (!this.data) {
18301
+ console.warn('[memory-data-service] Waiting value to be set...');
18302
+ }
18303
+ return this._onChange
18304
+ .pipe(filter(isNotNil), mergeMap(_ => this.loadAll(offset, size, sortBy, sortDirection, filterData, options)));
18252
18305
  }
18253
18306
  saveAll(data, options) {
18254
18307
  return __awaiter(this, void 0, void 0, function* () {
@@ -18670,7 +18723,7 @@ function state2side(state) {
18670
18723
  return 1;
18671
18724
  }
18672
18725
  }
18673
- const ɵ0$b = (defaultStateSize) => [
18726
+ const ɵ0$1 = (defaultStateSize) => [
18674
18727
  Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
18675
18728
  Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
18676
18729
  Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
@@ -18678,7 +18731,7 @@ const ɵ0$b = (defaultStateSize) => [
18678
18731
  const SCALE_OPTIONS_DEFAULT = {
18679
18732
  startColor: rgbArrayMap.red,
18680
18733
  startStates: [0, 2, 3],
18681
- startStepsFn: ɵ0$b
18734
+ startStepsFn: ɵ0$1
18682
18735
  };
18683
18736
  /**
18684
18737
  * Internal function, that create a colors scale, using iteration
@@ -19485,7 +19538,7 @@ class UserSettingsValidatorService extends AppValidatorService {
19485
19538
  });
19486
19539
  }
19487
19540
  }
19488
- UserSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(ɵɵinject(FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
19541
+ UserSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
19489
19542
  UserSettingsValidatorService.decorators = [
19490
19543
  { type: Injectable, args: [{ providedIn: 'root' },] }
19491
19544
  ];
@@ -19529,7 +19582,7 @@ class AccountValidatorService extends AppValidatorService {
19529
19582
  return validatorFns.length ? Validators.compose(validatorFns) : validatorFns.length === 1 ? validatorFns[0] : undefined;
19530
19583
  }
19531
19584
  }
19532
- AccountValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
19585
+ AccountValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
19533
19586
  AccountValidatorService.decorators = [
19534
19587
  { type: Injectable, args: [{ providedIn: 'root' },] }
19535
19588
  ];
@@ -19823,7 +19876,7 @@ class MenuService {
19823
19876
  this._$opened.next(false);
19824
19877
  }
19825
19878
  }
19826
- MenuService.ɵprov = ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
19879
+ MenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
19827
19880
  MenuService.decorators = [
19828
19881
  { type: Injectable, args: [{
19829
19882
  providedIn: 'root'
@@ -20159,7 +20212,7 @@ class LocalSettingsValidatorService extends AppValidatorService {
20159
20212
  });
20160
20213
  }
20161
20214
  }
20162
- LocalSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(ɵɵinject(FormBuilder), ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
20215
+ LocalSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
20163
20216
  LocalSettingsValidatorService.decorators = [
20164
20217
  { type: Injectable, args: [{ providedIn: 'root' },] }
20165
20218
  ];
@@ -20778,7 +20831,7 @@ class IsOnFieldModePipe {
20778
20831
  return value === 'FIELD';
20779
20832
  }
20780
20833
  }
20781
- IsOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20834
+ IsOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20782
20835
  IsOnFieldModePipe.decorators = [
20783
20836
  { type: Pipe, args: [{
20784
20837
  name: 'isOnField'
@@ -20790,7 +20843,7 @@ class IsNotOnFieldModePipe {
20790
20843
  return value !== 'FIELD';
20791
20844
  }
20792
20845
  }
20793
- IsNotOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20846
+ IsNotOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20794
20847
  IsNotOnFieldModePipe.decorators = [
20795
20848
  { type: Pipe, args: [{
20796
20849
  name: 'isNotOnField'
@@ -20805,7 +20858,7 @@ class PersonToStringPipe {
20805
20858
  return PersonUtils.personToString(value);
20806
20859
  }
20807
20860
  }
20808
- PersonToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20861
+ PersonToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20809
20862
  PersonToStringPipe.decorators = [
20810
20863
  { type: Pipe, args: [{
20811
20864
  name: 'personToString'
@@ -21158,7 +21211,7 @@ class IsLoginAccountPipe {
21158
21211
  return value && value.pubkey && true;
21159
21212
  }
21160
21213
  }
21161
- IsLoginAccountPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
21214
+ IsLoginAccountPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
21162
21215
  IsLoginAccountPipe.decorators = [
21163
21216
  { type: Pipe, args: [{
21164
21217
  name: 'isLogin'
@@ -21170,7 +21223,7 @@ class AccountToStringPipe {
21170
21223
  return accountToString(value);
21171
21224
  }
21172
21225
  }
21173
- AccountToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
21226
+ AccountToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
21174
21227
  AccountToStringPipe.decorators = [
21175
21228
  { type: Pipe, args: [{
21176
21229
  name: 'accountToString'
@@ -21185,7 +21238,7 @@ class DepartmentToStringPipe {
21185
21238
  return departmentToString(value);
21186
21239
  }
21187
21240
  }
21188
- DepartmentToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
21241
+ DepartmentToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
21189
21242
  DepartmentToStringPipe.decorators = [
21190
21243
  { type: Pipe, args: [{
21191
21244
  name: 'departmentToString'
@@ -21820,7 +21873,7 @@ class AuthGuardService {
21820
21873
  }));
21821
21874
  }
21822
21875
  }
21823
- AuthGuardService.ɵprov = ɵɵdefineInjectable({ factory: function AuthGuardService_Factory() { return new AuthGuardService(ɵɵinject(AccountService), ɵɵinject(ModalController), ɵɵinject(Router), ɵɵinject(ENVIRONMENT)); }, token: AuthGuardService, providedIn: "root" });
21876
+ 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
21877
  AuthGuardService.decorators = [
21825
21878
  { type: Injectable, args: [{ providedIn: 'root' },] }
21826
21879
  ];
@@ -22285,8 +22338,6 @@ class AppTableUtils {
22285
22338
  }
22286
22339
  }
22287
22340
 
22288
- class AppTableDataSourceOptions {
22289
- }
22290
22341
  // @dynamic
22291
22342
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
22292
22343
  class EntitiesTableDataSource extends TableDataSource {
@@ -22299,30 +22350,22 @@ class EntitiesTableDataSource extends TableDataSource {
22299
22350
  * @param validatorService Service that create instances of the FormGroup used to validate row fields.
22300
22351
  * @param config Additional configuration for table.
22301
22352
  */
22302
- constructor(dataType, dataService, validatorService, config) {
22303
- super([], dataType, validatorService, config);
22353
+ constructor(dataType, dataService, validatorService, options) {
22354
+ super([], dataType, validatorService, Object.assign({ dataServiceOptions: {}, debug: (options === null || options === void 0 ? void 0 : options.suppressErrors) === false, keepOriginalDataAfterConfirm: false }, options));
22304
22355
  this.dataService = dataService;
22305
22356
  this._creating = false;
22306
22357
  this._saving = false;
22307
- this._useValidator = false;
22308
22358
  this._stopWatching$ = new Subject();
22309
22359
  this._editingRowCount = 0;
22310
22360
  this._fetchMoreFn = null;
22311
22361
  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;
22362
+ this._entityName = removeEnd((new dataType()).__typename || 'UnknownVO', 'VO');
22317
22363
  }
22318
22364
  get serviceOptions() {
22319
- return this._options.dataServiceOptions;
22365
+ return this.config.dataServiceOptions;
22320
22366
  }
22321
22367
  set serviceOptions(value) {
22322
- this._options.dataServiceOptions = value;
22323
- }
22324
- get options() {
22325
- return this._options;
22368
+ this.config.dataServiceOptions = value;
22326
22369
  }
22327
22370
  get loaded() {
22328
22371
  return this.loadingSubject.value === false; // Should be false when undefined (initial state)
@@ -22345,10 +22388,10 @@ class EntitiesTableDataSource extends TableDataSource {
22345
22388
  return this.dataService.watchAll(offset, size, sortBy, sortDirection, filter, this.serviceOptions)
22346
22389
  .pipe(catchError(err => this.handleError(err, 'ERROR.LOAD_DATA_ERROR')), map((res) => {
22347
22390
  if (this._saving) {
22348
- console.info(`[table-datasource] Received ${this._logTypeName} data (from service), but still saving: skip`);
22391
+ console.info(`[table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);
22349
22392
  }
22350
22393
  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!`);
22394
+ console.warn(`[table-datasource] Received ${this._entityName} data, while ${this._editingRowCount} rows still editing: skip; Please check save() implementation in the table!`);
22352
22395
  }
22353
22396
  else {
22354
22397
  this.updateDatasource((res.data || []));
@@ -22361,6 +22404,18 @@ class EntitiesTableDataSource extends TableDataSource {
22361
22404
  // ⚠ Notice: Don't put any operator after takeUntil to avoid potential subscription leaks
22362
22405
  );
22363
22406
  }
22407
+ updateDatasourceFromRows(rows) {
22408
+ var _a;
22409
+ // Avoid to update dataSourceSubject, when not need
22410
+ if ((_a = this.datasourceSubject.observers) === null || _a === void 0 ? void 0 : _a.length) {
22411
+ if (!this.config.suppressErrors)
22412
+ console.warn('[table-datasource] Update datasource subject. Please prefer using \'rowsSubject\' instead of \'datasourceSubject\'');
22413
+ super.updateDatasourceFromRows(rows);
22414
+ }
22415
+ else {
22416
+ console.debug('[table-datasource] Skipping datasourceSubject update (not used yet).');
22417
+ }
22418
+ }
22364
22419
  save() {
22365
22420
  return __awaiter(this, void 0, void 0, function* () {
22366
22421
  if (toBoolean(this.serviceOptions.readOnly, false)) {
@@ -22369,31 +22424,31 @@ class EntitiesTableDataSource extends TableDataSource {
22369
22424
  }
22370
22425
  // Saving twice (should never occur)
22371
22426
  if (this._saving) {
22372
- console.warn(`[table-datasource] Trying to save ${this._logTypeName} rows twice. Skip`);
22427
+ console.warn(`[table-datasource] Trying to save ${this._entityName} rows twice. Skip`);
22373
22428
  return false;
22374
22429
  }
22375
22430
  this._saving = true;
22376
22431
  this.markAsLoading();
22377
22432
  const onlyDirtyRows = toBoolean(this.serviceOptions.saveOnlyDirtyRows, false);
22378
22433
  try {
22379
- if (this._debug)
22380
- console.debug(`[table-datasource] Saving ${this._logTypeName} rows... {onlyDirty: ${onlyDirtyRows}}`);
22434
+ if (this.config.debug)
22435
+ console.debug(`[table-datasource] Saving ${this._entityName} rows... {onlyDirty: ${onlyDirtyRows}}`);
22381
22436
  // Get all rows
22382
- const rows = yield this.getRows();
22437
+ const rows = this.getRows();
22383
22438
  // Finish editing all rows
22384
22439
  const invalidRows = rows.filter(row => row.editing && !row.confirmEditCreate());
22385
22440
  // Cannot finish some rows: error
22386
22441
  if (invalidRows.length) {
22387
22442
  // log errors
22388
- if (this._debug)
22389
- invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._logTypeName} row #${row.id}`));
22443
+ if (this.config.debug)
22444
+ invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._entityName} row #${row.id}`));
22390
22445
  // Stop with an error
22391
22446
  throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
22392
22447
  }
22393
22448
  this._editingRowCount = 0;
22394
22449
  let data;
22395
22450
  let dataToSave;
22396
- if (this._useValidator) {
22451
+ if (this.validatorService) {
22397
22452
  dataToSave = [];
22398
22453
  data = rows.map(row => {
22399
22454
  const currentData = new this.dataConstructor();
@@ -22414,21 +22469,21 @@ class EntitiesTableDataSource extends TableDataSource {
22414
22469
  }
22415
22470
  // If no data to save: exit
22416
22471
  if (onlyDirtyRows && !dataToSave.length) {
22417
- if (this._debug)
22418
- console.debug(`[table-datasource] No ${this._logTypeName} data to save. Skip`);
22472
+ if (this.config.debug)
22473
+ console.debug(`[table-datasource] No ${this._entityName} data to save. Skip`);
22419
22474
  return false;
22420
22475
  }
22421
- if (this._debug)
22422
- console.debug(`[table-datasource] Asking service to save this ${this._logTypeName} data:`, dataToSave);
22476
+ if (this.config.debug)
22477
+ console.debug(`[table-datasource] Asking service to save this ${this._entityName} data:`, dataToSave);
22423
22478
  yield this.dataService.saveAll(dataToSave, this.serviceOptions);
22424
- if (this._debug)
22425
- console.debug(`[table-datasource] Saving ${this._logTypeName} data [OK]`);
22479
+ if (this.config.debug)
22480
+ console.debug(`[table-datasource] Saving ${this._entityName} data [OK]`);
22426
22481
  // 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
22482
  this.updateDatasource(data, { emitEvent: false });
22428
22483
  return true;
22429
22484
  }
22430
22485
  catch (error) {
22431
- if (this._debug)
22486
+ if (this.config.debug)
22432
22487
  console.error('[table-datasource] Error while saving: ' + error && error.message || error);
22433
22488
  throw error;
22434
22489
  }
@@ -22439,17 +22494,13 @@ class EntitiesTableDataSource extends TableDataSource {
22439
22494
  });
22440
22495
  }
22441
22496
  updateDatasource(data, opts) {
22442
- if (this._debug)
22497
+ if (this.config.debug)
22443
22498
  console.debug(`[table-datasource] Updating datasource with data:`, data);
22444
22499
  super.updateDatasource(data, opts);
22445
22500
  if (!opts || opts.emitEvent !== false) {
22446
22501
  this.markAsLoaded();
22447
22502
  }
22448
22503
  }
22449
- // Overwrite default signature
22450
- createNew(insertAt) {
22451
- this.asyncCreateNew(insertAt);
22452
- }
22453
22504
  connect(collectionViewer) {
22454
22505
  // DEBUG console.debug("[entities-datasource] connect");
22455
22506
  return super.connect(collectionViewer);
@@ -22471,38 +22522,37 @@ class EntitiesTableDataSource extends TableDataSource {
22471
22522
  console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
22472
22523
  row.validator.disable({ onlySelf: true, emitEvent: false });
22473
22524
  }
22525
+ this._editingRowCount--;
22474
22526
  return true;
22475
22527
  }
22476
22528
  confirmEdit(row) {
22477
22529
  if (!super.confirmEdit(row))
22478
22530
  return false;
22479
22531
  if (row.editing && row.validator) {
22480
- console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
22532
+ console.warn('[table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');
22481
22533
  row.validator.disable({ onlySelf: true, emitEvent: false });
22482
22534
  }
22535
+ this._editingRowCount--;
22483
22536
  return true;
22484
22537
  }
22485
22538
  startEdit(row) {
22486
- if (this._debug)
22487
- console.debug('[table-datasource] Start to edit row', row);
22488
- row.startEdit();
22539
+ if (!super.startEdit(row))
22540
+ return false;
22541
+ if (!row.editing && row.validator) {
22542
+ console.warn('[table-datasource] Row still has {editing: false} after startEdit()! Force editing');
22543
+ row.validator.enable({ onlySelf: true, emitEvent: false });
22544
+ }
22489
22545
  this._editingRowCount++;
22490
22546
  }
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
22547
  handleError(error, message) {
22498
22548
  const errorMsg = error && error.message || error;
22499
- console.error(`[table-datasource] Service ${this._logTypeName} sent error: ${errorMsg}`, error);
22549
+ console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
22500
22550
  this.markAsLoaded();
22501
22551
  throw new Error(message || errorMsg);
22502
22552
  }
22503
- handleErrorPromise(error) {
22553
+ handleServiceError(error) {
22504
22554
  const errorMsg = error && error.message || error;
22505
- console.error(`[table-datasource] Service ${this._logTypeName} sent error: ${errorMsg}`, error);
22555
+ console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
22506
22556
  this.markAsLoaded();
22507
22557
  throw error;
22508
22558
  }
@@ -22516,9 +22566,11 @@ class EntitiesTableDataSource extends TableDataSource {
22516
22566
  console.error(`[table-datasource] Row to delete with id=${id} not found`);
22517
22567
  return;
22518
22568
  }
22569
+ if (row.editing)
22570
+ this._editingRowCount--;
22519
22571
  this.loadingSubject.next(true);
22520
22572
  this.dataService.deleteAll([row.currentData], this.serviceOptions)
22521
- .catch(err => this.handleErrorPromise(err))
22573
+ .catch(err => this.handleServiceError(err))
22522
22574
  .then(() => {
22523
22575
  setTimeout(() => {
22524
22576
  // make sure row has been deleted (because GrapQHl cache remove can failed)
@@ -22530,66 +22582,73 @@ class EntitiesTableDataSource extends TableDataSource {
22530
22582
  });
22531
22583
  }
22532
22584
  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));
22585
+ const _super = Object.create(null, {
22586
+ delete: { get: () => super.delete }
22587
+ });
22588
+ return __awaiter(this, void 0, void 0, function* () {
22589
+ this.markAsLoading();
22590
+ const data = this.getDataFromRows(rows);
22591
+ const rowsById = Beans.collectById(rows);
22592
+ try {
22593
+ // Call service deletion
22594
+ yield this.dataService.deleteAll(data, this.serviceOptions);
22595
+ // Workaround, to be sure all rows have been deleted
22596
+ // Sometimes, the service miss deletion, or GrapQHl cache remove failed
22597
+ const rowNotDeleted = this.getRows().map(row => rows.find(r => r === row));
22598
+ // Apply missing deletion
22599
+ if (isNotEmptyArray(rowNotDeleted)) {
22600
+ console.warn(`[table-datasource] Force deletion of ${rowNotDeleted.length} rows (Is service update the cache ?)`);
22601
+ rowNotDeleted
22602
+ // Start from the end
22603
+ .sort((a, b) => a.id > b.id ? -1 : 1)
22604
+ .forEach(r => _super.delete.call(this, r.id));
22605
+ }
22606
+ }
22607
+ catch (err) {
22608
+ // Handle sservice error
22609
+ this.handleServiceError(err);
22610
+ }
22611
+ finally {
22612
+ this.loadingSubject.next(false);
22555
22613
  }
22556
- this.loadingSubject.next(false);
22557
22614
  });
22558
22615
  }
22559
22616
  getRows() {
22560
- return firstNotNilPromise(this.connect(null));
22617
+ return this.rowsSubject.getValue();
22561
22618
  }
22562
- asyncCreateNew(insertAt) {
22619
+ createNew(insertAt) {
22563
22620
  const _super = Object.create(null, {
22564
22621
  createNew: { get: () => super.createNew }
22565
22622
  });
22623
+ var _a;
22566
22624
  return __awaiter(this, void 0, void 0, function* () {
22567
22625
  if (this._creating)
22568
22626
  return; // Avoid multiple call (should never occur)
22569
22627
  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) {
22628
+ try {
22629
+ const row = yield _super.createNew.call(this, insertAt);
22630
+ if (!row)
22631
+ return;
22632
+ if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.onRowCreated) {
22576
22633
  try {
22577
- yield res;
22634
+ yield this.config.onRowCreated(row);
22578
22635
  }
22579
22636
  catch (err) {
22637
+ // Log, then continue
22580
22638
  console.error(err && err.message || err, err);
22581
22639
  }
22582
22640
  }
22641
+ this._editingRowCount++;
22642
+ return row;
22643
+ }
22644
+ finally {
22645
+ this._creating = false;
22583
22646
  }
22584
- this._editingRowCount++;
22585
- this._creating = false;
22586
22647
  });
22587
22648
  }
22588
22649
  getData() {
22589
- return __awaiter(this, void 0, void 0, function* () {
22590
- const rows = yield this.getRows();
22591
- return this.getDataFromRows(rows);
22592
- });
22650
+ const rows = this.getRows();
22651
+ return this.getDataFromRows(rows);
22593
22652
  }
22594
22653
  fetchMore(opts) {
22595
22654
  const _super = Object.create(null, {
@@ -22599,20 +22658,20 @@ class EntitiesTableDataSource extends TableDataSource {
22599
22658
  if (!this._fetchMoreFn)
22600
22659
  return false; // Avoid multiple call
22601
22660
  if (this._editingRowCount > 0) {
22602
- console.warn('Cannot fetch more because still editing row');
22661
+ console.warn(`Cannot fetch more ${this._entityName} because ${this._editingRowCount} row(s) still editing`);
22603
22662
  return;
22604
22663
  }
22664
+ console.debug(`Will fetching more row(s) still...`);
22605
22665
  // Forget the fetchMore function, to avoid multiple call
22606
22666
  const fetchMoreFn = this._fetchMoreFn;
22607
22667
  this._fetchMoreFn = null;
22608
22668
  // Fetch next page
22609
22669
  const res = yield fetchMoreFn();
22610
22670
  // Skip if empty (no more data)
22611
- if (isNotEmptyArray(res === null || res === void 0 ? void 0 : res.data))
22671
+ if (isEmptyArray(res === null || res === void 0 ? void 0 : res.data))
22612
22672
  return false;
22613
22673
  // Update the data source
22614
- const existingData = yield this.getData();
22615
- _super.updateDatasource.call(this, existingData.concat(...res.data), opts);
22674
+ _super.updateDatasource.call(this, (this.currentData || []).concat(...res.data), opts);
22616
22675
  // Remember fetchMore
22617
22676
  this._fetchMoreFn = res.fetchMore;
22618
22677
  return true;
@@ -22636,8 +22695,8 @@ EntitiesTableDataSource.decorators = [
22636
22695
  EntitiesTableDataSource.ctorParameters = () => [
22637
22696
  { type: Function },
22638
22697
  { type: undefined },
22639
- { type: ValidatorService },
22640
- { type: AppTableDataSourceOptions }
22698
+ { type: undefined },
22699
+ { type: undefined }
22641
22700
  ];
22642
22701
 
22643
22702
  const SETTINGS_DISPLAY_COLUMNS = 'displayColumns';
@@ -23925,7 +23984,7 @@ class AppTable {
23925
23984
  return __awaiter(this, void 0, void 0, function* () {
23926
23985
  this.focusFirstColumn = true;
23927
23986
  this.focusColumn = (opts === null || opts === void 0 ? void 0 : opts.focusColumn) || this.firstUserColumn;
23928
- yield this._dataSource.asyncCreateNew(insertAt);
23987
+ yield this._dataSource.createNew(insertAt);
23929
23988
  this.editedRow = this._dataSource.getRow(-1);
23930
23989
  // Emit start editing event
23931
23990
  this.onStartEditingRow.emit(this.editedRow);
@@ -24108,7 +24167,7 @@ class AppTable {
24108
24167
  var _a, _b;
24109
24168
  return __awaiter(this, void 0, void 0, function* () {
24110
24169
  // Mark row as pristine
24111
- const markRowAsPristine = ((_a = this.dataSource) === null || _a === void 0 ? void 0 : _a.options.keepOriginalDataAfterConfirm) === true;
24170
+ const markRowAsPristine = ((_a = this.dataSource) === null || _a === void 0 ? void 0 : _a.config.restoreOriginalDataOnCancel) === true;
24112
24171
  if (markRowAsPristine) {
24113
24172
  (_b = row.validator) === null || _b === void 0 ? void 0 : _b.markAsPristine();
24114
24173
  // Check if table is now pristine
@@ -26000,7 +26059,7 @@ AppInMemoryTable.ctorParameters = () => [
26000
26059
  { type: Function },
26001
26060
  { type: InMemoryEntitiesService },
26002
26061
  { type: ValidatorService },
26003
- { type: AppTableDataSourceOptions },
26062
+ { type: undefined },
26004
26063
  { type: undefined }
26005
26064
  ];
26006
26065
  AppInMemoryTable.propDecorators = {
@@ -26017,7 +26076,7 @@ const SocialErrorCodes = {
26017
26076
  SUBSCRIBE_JOB_PROGRESSION_ERROR: 50010
26018
26077
  };
26019
26078
 
26020
- const moment$6 = momentImported;
26079
+ const moment$4 = momentImported;
26021
26080
  const USER_EVENT_SERVICE = new InjectionToken('UserEventService');
26022
26081
  class AbstractUserEventService extends BaseGraphqlService {
26023
26082
  constructor(graphql, accountService, network, translate, options) {
@@ -26383,7 +26442,7 @@ class AbstractUserEventService extends BaseGraphqlService {
26383
26442
  }
26384
26443
  resetCount() {
26385
26444
  this._countSubject.next(undefined);
26386
- this.resetCountDate = moment$6();
26445
+ this.resetCountDate = moment$4();
26387
26446
  // restart listening count changes
26388
26447
  this.startListenCountChanges();
26389
26448
  }
@@ -26443,7 +26502,7 @@ class AbstractUserEventService extends BaseGraphqlService {
26443
26502
  if (!userEvents.length)
26444
26503
  return;
26445
26504
  // set read date
26446
- userEvents.forEach(userEvent => userEvent.readDate = moment$6());
26505
+ userEvents.forEach(userEvent => userEvent.readDate = moment$4());
26447
26506
  // split local/remote entities
26448
26507
  const localEntities = userEvents.filter(userEvent => !userEvent.id || userEvent.id < 0);
26449
26508
  const remoteEntities = userEvents.filter(userEvent => userEvent.id > 0);
@@ -27418,7 +27477,7 @@ class MessageService extends BaseGraphqlService {
27418
27477
  });
27419
27478
  }
27420
27479
  }
27421
- MessageService.ɵprov = ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(ɵɵinject(GraphqlService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT, 8)); }, token: MessageService, providedIn: "root" });
27480
+ 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
27481
  MessageService.decorators = [
27423
27482
  { type: Injectable, args: [{ providedIn: 'root' },] }
27424
27483
  ];
@@ -27627,7 +27686,7 @@ class PersonService extends BaseEntityService {
27627
27686
  return target;
27628
27687
  }
27629
27688
  }
27630
- PersonService.ɵprov = ɵɵdefineInjectable({ factory: function PersonService_Factory() { return new PersonService(ɵɵinject(GraphqlService), ɵɵinject(PlatformService), ɵɵinject(NetworkService), ɵɵinject(EntitiesStorage)); }, token: PersonService, providedIn: "root" });
27689
+ 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
27690
  PersonService.decorators = [
27632
27691
  { type: Injectable, args: [{ providedIn: 'root' },] }
27633
27692
  ];
@@ -27658,7 +27717,7 @@ class PersonValidatorService {
27658
27717
  return this.formBuilder.group(formConfig);
27659
27718
  }
27660
27719
  }
27661
- PersonValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
27720
+ PersonValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
27662
27721
  PersonValidatorService.decorators = [
27663
27722
  { type: Injectable, args: [{ providedIn: 'root' },] }
27664
27723
  ];
@@ -27887,17 +27946,17 @@ AdminModule.decorators = [
27887
27946
  ];
27888
27947
  AdminModule.ctorParameters = () => [];
27889
27948
 
27890
- const ɵ0$c = {
27949
+ const ɵ0 = {
27891
27950
  profile: 'ADMIN'
27892
27951
  };
27893
- const routes = [
27952
+ const routes$6 = [
27894
27953
  {
27895
27954
  path: 'users',
27896
27955
  pathMatch: 'full',
27897
27956
  component: UsersPage,
27898
27957
  canActivate: [AuthGuardService],
27899
27958
  canDeactivate: [ComponentDirtyGuard],
27900
- data: ɵ0$c
27959
+ data: ɵ0
27901
27960
  }
27902
27961
  ];
27903
27962
  class AdminRoutingModule {
@@ -27907,27 +27966,27 @@ AdminRoutingModule.decorators = [
27907
27966
  imports: [
27908
27967
  SharedRoutingModule,
27909
27968
  AdminModule,
27910
- RouterModule.forChild(routes)
27969
+ RouterModule.forChild(routes$6)
27911
27970
  ],
27912
27971
  exports: [RouterModule]
27913
27972
  },] }
27914
27973
  ];
27915
27974
 
27916
- class EntityTestClass {
27975
+ class EntityTestClass$1 {
27917
27976
  }
27918
- const FAKE_ENTITIES = [
27977
+ const FAKE_ENTITIES$1 = [
27919
27978
  { id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments... again for A' },
27920
27979
  { id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments... again for B' },
27921
27980
  { id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments... again for C' }
27922
27981
  ];
27923
- function deepCopy(values, size) {
27982
+ function deepCopy$1(values, size) {
27924
27983
  if (isNil(size)) {
27925
- return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
27984
+ return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
27926
27985
  }
27927
27986
  let result = [];
27928
27987
  let i = 1;
27929
27988
  while (result.length < size) {
27930
- result = result.concat((values || FAKE_ENTITIES).map(entity => {
27989
+ result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
27931
27990
  const name = entity.name + ' #' + i;
27932
27991
  return Object.assign(Object.assign({}, entity), { id: i++, name });
27933
27992
  }));
@@ -27937,7 +27996,7 @@ function deepCopy(values, size) {
27937
27996
  class AutocompleteTestPage {
27938
27997
  constructor(formBuilder) {
27939
27998
  this.formBuilder = formBuilder;
27940
- this._items = deepCopy(FAKE_ENTITIES, 100);
27999
+ this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
27941
28000
  this._$items = new BehaviorSubject(undefined);
27942
28001
  this.autocompleteFields = new MatAutocompleteConfigHolder();
27943
28002
  this.memoryHide = false;
@@ -27982,7 +28041,7 @@ class AutocompleteTestPage {
27982
28041
  });
27983
28042
  // From items
27984
28043
  this.autocompleteFields.add('entity-items-large', {
27985
- items: FAKE_ENTITIES.slice(),
28044
+ items: FAKE_ENTITIES$1.slice(),
27986
28045
  attributes: ['label', 'name', 'description', 'comments'],
27987
28046
  displayWith: this.entityToString
27988
28047
  });
@@ -28014,14 +28073,14 @@ class AutocompleteTestPage {
28014
28073
  loadData() {
28015
28074
  return __awaiter(this, void 0, void 0, function* () {
28016
28075
  const data = {
28017
- entity: deepCopy(FAKE_ENTITIES)[0],
28018
- farEntity: deepCopy(FAKE_ENTITIES)[2],
28076
+ entity: deepCopy$1(FAKE_ENTITIES$1)[0],
28077
+ farEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
28019
28078
  // This item is NOT in the items list => i should be displayed anyway
28020
28079
  missingEntity: {
28021
28080
  id: -1, label: '??', name: 'Missing item'
28022
28081
  },
28023
- disableEntity: deepCopy(FAKE_ENTITIES)[2],
28024
- entities: deepCopy(FAKE_ENTITIES)
28082
+ disableEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
28083
+ entities: deepCopy$1(FAKE_ENTITIES$1)
28025
28084
  };
28026
28085
  this.form.setValue(data);
28027
28086
  // Load observables
@@ -28171,13 +28230,13 @@ LatLongTestPage.ctorParameters = () => [
28171
28230
  { type: FormBuilder }
28172
28231
  ];
28173
28232
 
28174
- const moment$7 = momentImported;
28233
+ const moment$3 = momentImported;
28175
28234
  class SwipeTestPage {
28176
28235
  constructor(formBuilder, dateFormatPipe) {
28177
28236
  this.formBuilder = formBuilder;
28178
28237
  this.dateFormatPipe = dateFormatPipe;
28179
28238
  this.$dates = new BehaviorSubject(undefined);
28180
- this._today = moment$7().startOf('day');
28239
+ this._today = moment$3().startOf('day');
28181
28240
  this.form = formBuilder.group({
28182
28241
  empty: [null, Validators.required],
28183
28242
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -28190,7 +28249,7 @@ class SwipeTestPage {
28190
28249
  ngOnInit() {
28191
28250
  const dates = [];
28192
28251
  for (let d = 0; d < 7; d++) {
28193
- dates[d] = moment$7(this._today).add(d - 3, 'day');
28252
+ dates[d] = moment$3(this._today).add(d - 3, 'day');
28194
28253
  }
28195
28254
  this.$dates.next(dates);
28196
28255
  this.loadData();
@@ -28231,7 +28290,7 @@ SwipeTestPage.ctorParameters = () => [
28231
28290
  { type: DateFormatPipe }
28232
28291
  ];
28233
28292
 
28234
- const moment$8 = momentImported;
28293
+ const moment$2 = momentImported;
28235
28294
  class DateTimeTestPage {
28236
28295
  constructor(platform, formBuilder, cd) {
28237
28296
  this.platform = platform;
@@ -28265,7 +28324,7 @@ class DateTimeTestPage {
28265
28324
  // Load the form with data
28266
28325
  loadData() {
28267
28326
  return __awaiter(this, void 0, void 0, function* () {
28268
- const now = moment$8();
28327
+ const now = moment$2();
28269
28328
  const data = {
28270
28329
  empty: null,
28271
28330
  emptyRequired: null,
@@ -28331,9 +28390,9 @@ DateTimeTestPage.ctorParameters = () => [
28331
28390
  { type: ChangeDetectorRef }
28332
28391
  ];
28333
28392
 
28334
- class EntityTestClass$1 {
28393
+ class EntityTestClass {
28335
28394
  }
28336
- const FAKE_ENTITIES$1 = [
28395
+ const FAKE_ENTITIES = [
28337
28396
  { id: 1, label: 'AAA', name: 'Item A' },
28338
28397
  { id: 2, label: 'BBB', name: 'Item B' },
28339
28398
  { id: 3, label: 'CCC', name: 'Item C' },
@@ -28342,14 +28401,14 @@ const FAKE_ENTITIES$1 = [
28342
28401
  { id: 6, label: 'FFF', name: 'Item F' },
28343
28402
  { id: 7, label: 'GGG', name: 'Item G' }
28344
28403
  ];
28345
- function deepCopy$1(values, size) {
28404
+ function deepCopy(values, size) {
28346
28405
  if (isNil(size)) {
28347
- return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
28406
+ return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
28348
28407
  }
28349
28408
  let result = [];
28350
28409
  let i = 1;
28351
28410
  while (result.length < size) {
28352
- result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
28411
+ result = result.concat((values || FAKE_ENTITIES).map(entity => {
28353
28412
  const name = entity.name + ' #' + i;
28354
28413
  return Object.assign(Object.assign({}, entity), { id: i++, name });
28355
28414
  }));
@@ -28359,7 +28418,7 @@ function deepCopy$1(values, size) {
28359
28418
  class ChipsTestPage {
28360
28419
  constructor(formBuilder) {
28361
28420
  this.formBuilder = formBuilder;
28362
- this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
28421
+ this._items = deepCopy(FAKE_ENTITIES, 100);
28363
28422
  this._$items = new BehaviorSubject(undefined);
28364
28423
  this.autocompleteFields = new MatAutocompleteConfigHolder();
28365
28424
  this.appearance = 'legacy';
@@ -28399,7 +28458,7 @@ class ChipsTestPage {
28399
28458
  // Load the form with data
28400
28459
  loadData() {
28401
28460
  return __awaiter(this, void 0, void 0, function* () {
28402
- const items = deepCopy$1(FAKE_ENTITIES$1);
28461
+ const items = deepCopy(FAKE_ENTITIES);
28403
28462
  const data = {
28404
28463
  entity: items.slice(0, 1),
28405
28464
  entityInitial: items.slice(1, 2),
@@ -28515,7 +28574,7 @@ NumpadTestPage.ctorParameters = () => [
28515
28574
  { type: FormBuilder }
28516
28575
  ];
28517
28576
 
28518
- const moment$9 = momentImported;
28577
+ const moment$1 = momentImported;
28519
28578
  class DateTestPage {
28520
28579
  constructor(formBuilder, cd) {
28521
28580
  this.formBuilder = formBuilder;
@@ -28548,7 +28607,7 @@ class DateTestPage {
28548
28607
  // Load the form with data
28549
28608
  loadData() {
28550
28609
  return __awaiter(this, void 0, void 0, function* () {
28551
- const now = moment$9();
28610
+ const now = moment$1();
28552
28611
  const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
28553
28612
  const data = {
28554
28613
  empty: null,
@@ -28626,7 +28685,7 @@ const SHARED_MATERIAL_TESTING_PAGES = [
28626
28685
  { label: 'Shared directives', divider: true },
28627
28686
  { label: 'Badge icon directive', page: '/testing/shared/badge-icon' }
28628
28687
  ];
28629
- const routes$1 = [
28688
+ const routes$5 = [
28630
28689
  {
28631
28690
  path: '',
28632
28691
  pathMatch: 'full',
@@ -28683,7 +28742,7 @@ MaterialTestingModule.decorators = [
28683
28742
  ReactiveFormsModule,
28684
28743
  SharedMaterialModule,
28685
28744
  TranslateModule.forChild(),
28686
- RouterModule.forChild(routes$1)
28745
+ RouterModule.forChild(routes$5)
28687
28746
  ],
28688
28747
  declarations: [
28689
28748
  DateTimeTestPage,
@@ -28744,7 +28803,7 @@ ToastTestingPage.ctorParameters = () => [
28744
28803
  { type: TranslateService }
28745
28804
  ];
28746
28805
 
28747
- const routes$2 = [
28806
+ const routes$4 = [
28748
28807
  {
28749
28808
  path: 'toast',
28750
28809
  pathMatch: 'full',
@@ -28759,7 +28818,7 @@ ToastTestingModule.decorators = [
28759
28818
  CommonModule,
28760
28819
  IonicModule,
28761
28820
  TranslateModule.forChild(),
28762
- RouterModule.forChild(routes$2)
28821
+ RouterModule.forChild(routes$4)
28763
28822
  ],
28764
28823
  declarations: [
28765
28824
  ToastTestingPage
@@ -29046,33 +29105,28 @@ class TableTestPage extends AppTable {
29046
29105
  console.debug('[test-table] Updating data...');
29047
29106
  this.markAsLoading();
29048
29107
  if (isNil(this.data)) {
29049
- this.data = this.generateData(0, this.enableInfiniteScroll ? this.defaultPageSize : TableTestPage.maxRowCount);
29108
+ this.data = this.generateData(0, TableTestPage.maxRowCount);
29050
29109
  }
29051
29110
  this.dataService.setValue(this.data, { emitEvent: false });
29052
29111
  this.onRefresh.emit();
29053
- if (this.infiniteScroll) {
29054
- this.infiniteScroll.disabled = !this.infiniteScroll || this.data.length >= TableTestPage.maxRowCount;
29055
- }
29056
29112
  }
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);
29113
+ fetchMore(event) {
29114
+ return __awaiter(this, void 0, void 0, function* () {
29115
+ console.debug('[table-test] Loading more...', event);
29116
+ const fetched = yield this._dataSource.fetchMore();
29117
+ // When target wait for a complete (e.g. IonRefresher)
29118
+ if (fetched && (event === null || event === void 0 ? void 0 : event.target) && event.target.complete) {
29119
+ yield this.waitIdle();
29120
+ event.target.complete();
29121
+ }
29122
+ });
29069
29123
  }
29070
- save() {
29124
+ save(opts) {
29071
29125
  const _super = Object.create(null, {
29072
29126
  save: { get: () => super.save }
29073
29127
  });
29074
29128
  return __awaiter(this, void 0, void 0, function* () {
29075
- const saved = yield _super.save.call(this);
29129
+ const saved = yield _super.save.call(this, opts);
29076
29130
  if (saved) {
29077
29131
  // Update source data
29078
29132
  this.data = this.dataService.value;
@@ -29138,7 +29192,7 @@ TableTestPage.maxRowCount = 100;
29138
29192
  TableTestPage.decorators = [
29139
29193
  { type: Component, args: [{
29140
29194
  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",
29195
+ 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
29196
  providers: [
29143
29197
  {
29144
29198
  provide: AppValidatorService,
@@ -29218,7 +29272,7 @@ TextPopoverTestingPage.ctorParameters = () => [
29218
29272
  { type: PopoverController }
29219
29273
  ];
29220
29274
 
29221
- const routes$4 = [
29275
+ const routes$2 = [
29222
29276
  {
29223
29277
  path: 'text-popover',
29224
29278
  pathMatch: 'full',
@@ -29233,7 +29287,7 @@ TextPopoverTestingModule.decorators = [
29233
29287
  CommonModule,
29234
29288
  IonicModule,
29235
29289
  TranslateModule.forChild(),
29236
- RouterModule.forChild(routes$4)
29290
+ RouterModule.forChild(routes$2)
29237
29291
  ],
29238
29292
  declarations: [
29239
29293
  TextPopoverTestingPage
@@ -29250,7 +29304,7 @@ const CORE_TESTING_PAGES = [
29250
29304
  { label: 'Table', page: '/testing/core/table' },
29251
29305
  { label: 'Text popover', page: '/testing/core/text-popover' }
29252
29306
  ];
29253
- const routes$5 = [
29307
+ const routes$1 = [
29254
29308
  {
29255
29309
  path: '',
29256
29310
  pathMatch: 'full',
@@ -29274,7 +29328,7 @@ CoreTestingModule.decorators = [
29274
29328
  imports: [
29275
29329
  CommonModule,
29276
29330
  TranslateModule.forChild(),
29277
- RouterModule.forChild(routes$5),
29331
+ RouterModule.forChild(routes$1),
29278
29332
  // Sub modules
29279
29333
  TableTestingModule,
29280
29334
  TextPopoverTestingModule
@@ -29577,7 +29631,7 @@ UserEventTestService.ctorParameters = () => [
29577
29631
  { type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
29578
29632
  ];
29579
29633
 
29580
- const moment$a = momentImported;
29634
+ const moment = momentImported;
29581
29635
  class UserEventTestingPage {
29582
29636
  constructor(userEventService, router, alertController, translateService) {
29583
29637
  this.userEventService = userEventService;
@@ -29638,7 +29692,7 @@ class UserEventTestingPage {
29638
29692
  type: 'message',
29639
29693
  level: 'INFO',
29640
29694
  message: 'message test message test message test message test message test message test message test message test',
29641
- creationDate: moment$a(),
29695
+ creationDate: moment(),
29642
29696
  }));
29643
29697
  }
29644
29698
  addError() {
@@ -29648,7 +29702,7 @@ class UserEventTestingPage {
29648
29702
  type: 'upload',
29649
29703
  level: 'ERROR',
29650
29704
  message: 'message error',
29651
- creationDate: moment$a(),
29705
+ creationDate: moment(),
29652
29706
  }));
29653
29707
  }
29654
29708
  addWarning() {
@@ -29658,7 +29712,7 @@ class UserEventTestingPage {
29658
29712
  type: 'download',
29659
29713
  level: 'WARNING',
29660
29714
  message: 'message warning',
29661
- creationDate: moment$a(),
29715
+ creationDate: moment(),
29662
29716
  }));
29663
29717
  }
29664
29718
  addDebug() {
@@ -29668,7 +29722,7 @@ class UserEventTestingPage {
29668
29722
  type: 'debug',
29669
29723
  level: 'DEBUG',
29670
29724
  message: 'message DEBUG',
29671
- creationDate: moment$a(),
29725
+ creationDate: moment(),
29672
29726
  }));
29673
29727
  }
29674
29728
  addNotificationWithLink() {
@@ -29678,7 +29732,7 @@ class UserEventTestingPage {
29678
29732
  type: 'message',
29679
29733
  level: 'INFO',
29680
29734
  message: 'message with link',
29681
- creationDate: moment$a(),
29735
+ creationDate: moment(),
29682
29736
  actions: [{
29683
29737
  name: 'click here',
29684
29738
  iconRef: {
@@ -29695,7 +29749,7 @@ class UserEventTestingPage {
29695
29749
  type: 'message',
29696
29750
  level: 'INFO',
29697
29751
  message: 'message with action',
29698
- creationDate: moment$a(),
29752
+ creationDate: moment(),
29699
29753
  actions: [
29700
29754
  {
29701
29755
  name: 'click here',
@@ -29767,7 +29821,7 @@ class UserEventTestingPage {
29767
29821
  type: 'message',
29768
29822
  level: 'INFO',
29769
29823
  message: 'message with action',
29770
- creationDate: moment$a(),
29824
+ creationDate: moment(),
29771
29825
  actions: [
29772
29826
  {
29773
29827
  default: true,
@@ -29821,7 +29875,7 @@ const SOCIAL_TESTING_PAGES = [
29821
29875
  { label: 'User event', page: '/testing/social/user-event' },
29822
29876
  { label: 'Job progression', page: '/testing/social/job-progression' }
29823
29877
  ];
29824
- const routes$6 = [
29878
+ const routes = [
29825
29879
  {
29826
29880
  path: 'job-progression',
29827
29881
  pathMatch: 'full',
@@ -29840,7 +29894,7 @@ SocialTestingModule.decorators = [
29840
29894
  imports: [
29841
29895
  CommonModule,
29842
29896
  TranslateModule.forChild(),
29843
- RouterModule.forChild(routes$6),
29897
+ RouterModule.forChild(routes),
29844
29898
  JobTestingModule,
29845
29899
  UserEventTestingModule
29846
29900
  ],
@@ -29853,5 +29907,5 @@ SocialTestingModule.decorators = [
29853
29907
  * Generated bundle index. Do not edit.
29854
29908
  */
29855
29909
 
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 };
29910
+ 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
29911
  //# sourceMappingURL=sumaris-net.ngx-components.js.map