@sumaris-net/ngx-components 1.18.7 → 1.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +804 -429
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/doc/changelog.md +10 -0
  6. package/esm2015/public_api.js +10 -5
  7. package/esm2015/src/app/admin/admin-routing.module.js +3 -1
  8. package/esm2015/src/app/admin/admin.module.js +2 -1
  9. package/esm2015/src/app/admin/users/list/users.js +45 -7
  10. package/esm2015/src/app/core/services/base-entity-service.class.js +6 -6
  11. package/esm2015/src/app/core/services/local-settings.service.js +5 -5
  12. package/esm2015/src/app/core/services/model/referential.model.js +1 -1
  13. package/esm2015/src/app/core/services/platform.service.js +3 -4
  14. package/esm2015/src/app/shared/material/datetime/material.date.js +82 -70
  15. package/esm2015/src/app/shared/material/datetime/material.datetime.js +3 -3
  16. package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +7 -5
  17. package/esm2015/src/app/shared/platforms.js +20 -4
  18. package/esm2015/src/app/shared/validator/validators.js +2 -2
  19. package/esm2015/src/app/social/message/message.form.js +73 -0
  20. package/esm2015/src/app/social/message/message.modal.js +96 -0
  21. package/esm2015/src/app/social/message/message.model.js +65 -0
  22. package/esm2015/src/app/social/message/message.service.js +87 -0
  23. package/esm2015/src/app/social/social.errors.js +6 -0
  24. package/esm2015/src/app/social/social.module.js +12 -15
  25. package/esm2015/src/app/social/user-event/user-event.fragments.js +27 -0
  26. package/esm2015/src/app/social/user-event/user-event.model.js +46 -0
  27. package/esm2015/src/app/social/user-event/user-event.service.js +367 -0
  28. package/esm2015/src/app/social/user-event/user-events.table.js +154 -0
  29. package/fesm2015/sumaris-net.ngx-components.js +734 -411
  30. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  31. package/package.json +4 -3
  32. package/public_api.d.ts +9 -4
  33. package/src/app/admin/users/list/users.d.ts +10 -6
  34. package/src/app/core/services/local-settings.service.d.ts +3 -2
  35. package/src/app/core/services/model/referential.model.d.ts +7 -7
  36. package/src/app/shared/material/datetime/material.date.d.ts +6 -8
  37. package/src/app/shared/material/datetime/material.datetime.d.ts +2 -2
  38. package/src/app/shared/platforms.d.ts +1 -1
  39. package/src/app/social/message/message.form.d.ts +27 -0
  40. package/src/app/social/message/message.modal.d.ts +36 -0
  41. package/src/app/social/message/message.model.d.ts +31 -0
  42. package/src/app/social/message/message.service.d.ts +24 -0
  43. package/src/app/social/{services/errors.d.ts → social.errors.d.ts} +2 -1
  44. package/src/app/social/social.module.d.ts +0 -2
  45. package/src/app/social/{services/social.fragments.d.ts → user-event/user-event.fragments.d.ts} +1 -1
  46. package/src/app/social/{services/model → user-event}/user-event.model.d.ts +1 -1
  47. package/src/app/social/{services → user-event}/user-event.service.d.ts +4 -3
  48. package/src/app/social/{list → user-event}/user-events.table.d.ts +2 -2
  49. package/src/assets/i18n/en-US.json +23 -4
  50. package/src/assets/i18n/en.json +23 -4
  51. package/src/assets/i18n/fr.json +25 -5
  52. package/src/theme/_ionic.globals.scss +2 -1
  53. package/sumaris-net.ngx-components.metadata.json +1 -1
  54. package/esm2015/src/app/admin/services/errors.js +0 -6
  55. package/esm2015/src/app/social/list/user-events.table.js +0 -154
  56. package/esm2015/src/app/social/services/errors.js +0 -5
  57. package/esm2015/src/app/social/services/model/user-event.model.js +0 -46
  58. package/esm2015/src/app/social/services/social.fragments.js +0 -27
  59. package/esm2015/src/app/social/services/user-event.service.js +0 -367
  60. package/src/app/admin/services/errors.d.ts +0 -5
@@ -1,12 +1,9 @@
1
- import * as i0 from '@angular/core';
2
- import { InjectionToken, EventEmitter, Component, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, Output, ViewChild, Pipe, Injectable, Directive, Inject, NgModule, ElementRef, TemplateRef, ViewContainerRef, HostBinding, HostListener, ViewChildren, ComponentFactoryResolver, ApplicationRef, Injector, Renderer2, ViewEncapsulation } from '@angular/core';
3
- import * as i1$3 from '@angular/common';
1
+ import { InjectionToken, EventEmitter, Component, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, Output, ViewChild, ɵɵdefineInjectable, ɵɵinject, Pipe, Injectable, Directive, Inject, NgModule, ElementRef, TemplateRef, ViewContainerRef, HostBinding, HostListener, ViewChildren, ComponentFactoryResolver, ApplicationRef, INJECTOR, Injector, Renderer2, ViewEncapsulation } from '@angular/core';
4
2
  import { CommonModule, DOCUMENT, Location } from '@angular/common';
5
3
  import { CdkTableModule } from '@angular/cdk/table';
6
4
  import { A11yModule } from '@angular/cdk/a11y';
7
5
  import { OverlayModule, OverlayContainer, FullscreenOverlayContainer, Overlay } from '@angular/cdk/overlay';
8
6
  import { ScrollingModule } from '@angular/cdk/scrolling';
9
- import * as i1$2 from '@angular/material/core';
10
7
  import { DateAdapter, MatCommonModule, MatRippleModule } from '@angular/material/core';
11
8
  import { MatTableModule, MatTable, MatColumnDef } from '@angular/material/table';
12
9
  import { MatSortModule, MatSort } from '@angular/material/sort';
@@ -30,22 +27,17 @@ import { MatProgressBarModule } from '@angular/material/progress-bar';
30
27
  import { MatRadioModule } from '@angular/material/radio';
31
28
  import { MatBadgeModule } from '@angular/material/badge';
32
29
  import { MatSlideToggleModule } from '@angular/material/slide-toggle';
33
- import * as i2$1 from '@angular/material/dialog';
34
30
  import { MatDialogModule, MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';
35
31
  import { MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteModule, MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MAT_AUTOCOMPLETE_DEFAULT_OPTIONS } from '@angular/material/autocomplete';
36
32
  import { __awaiter, __decorate } from 'tslib';
37
- import * as i1$6 from '@angular/forms';
38
33
  import { Validators, NG_VALUE_ACCESSOR, FormGroupDirective, AbstractControl, FormGroup, FormArray, FormControl, ReactiveFormsModule, FormBuilder } from '@angular/forms';
39
34
  import { timer, merge, fromEvent, BehaviorSubject, Subscription, Subject, isObservable, from, of, noop as noop$9, Observable, defer, forkJoin, combineLatest, EMPTY } from 'rxjs';
40
35
  import { filter, first, map, takeUntil, switchMap, startWith, debounceTime, takeWhile, tap, distinctUntilChanged, mergeMap, catchError, throttleTime, skip } from 'rxjs/operators';
41
36
  import { trigger, transition, style, animate, state } from '@angular/animations';
42
- import * as i1$1 from '@ngx-translate/core';
43
37
  import { TranslateService, TranslateModule } from '@ngx-translate/core';
44
- import * as i1$4 from '@ionic/angular';
45
38
  import { IonicModule, Platform, IonRouterOutlet, ModalController, PopoverController, IonicSafeString, createAnimation, ToastController, AlertController, IonicRouteStrategy, NavParams, MenuController, IonContent, IonInfiniteScroll } from '@ionic/angular';
46
39
  import * as momentImported from 'moment';
47
40
  import { isMoment } from 'moment';
48
- import * as i1 from '@angular/material-moment-adapter';
49
41
  import { MomentDateAdapter, MatMomentDateModule } from '@angular/material-moment-adapter';
50
42
  import * as momentTZImported from 'moment-timezone';
51
43
  import { Keyboard } from '@ionic-native/keyboard/ngx';
@@ -55,38 +47,32 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
55
47
  import { MatDividerModule } from '@angular/material/divider';
56
48
  import { MatTooltipModule } from '@angular/material/tooltip';
57
49
  import { MatChipsModule } from '@angular/material/chips';
58
- import * as i3$3 from '@angular/router';
59
50
  import { Router, ActivatedRoute, RouterModule, RouteReuseStrategy } from '@angular/router';
60
- import * as i1$5 from '@angular/platform-browser';
61
51
  import { HammerGestureConfig, EventManager } from '@angular/platform-browser';
62
- import * as i2$2 from '@angular/common/http';
63
52
  import { HttpResponse, HttpClient, HttpHeaders, HttpEventType, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
64
53
  import { ColorPickerModule } from 'ngx-color-picker';
65
- import { NativeAudio } from '@ionic-native/native-audio/ngx';
66
- import { Vibration } from '@ionic-native/vibration/ngx';
54
+ import { NativeAudio as NativeAudio$1 } from '@ionic-native/native-audio/ngx';
55
+ import { Vibration as Vibration$1 } from '@ionic-native/vibration/ngx';
67
56
  import { AudioManagement } from '@ionic-native/audio-management/ngx';
68
- import * as i2 from '@ionic-native/native-audio/ngx/index';
69
- import * as i3 from '@ionic-native/vibration/ngx/index';
70
- import * as i4 from '@ionic-native/audio-management/ngx/index';
57
+ import { NativeAudio } from '@ionic-native/native-audio/ngx/index';
58
+ import { Vibration } from '@ionic-native/vibration/ngx/index';
59
+ import { AudioManagement as AudioManagement$1 } from '@ionic-native/audio-management/ngx/index';
71
60
  import * as uuidv4Imported from 'uuid/v4';
72
61
  import { DragDropModule } from '@angular/cdk/drag-drop';
73
62
  import { MarkdownModule } from 'ngx-markdown';
74
63
  import { sign, box, hash, verify } from 'tweetnacl';
75
- import * as i3$1 from '@ionic/storage';
76
64
  import { Storage, IonicStorageModule } from '@ionic/storage';
77
65
  import 'zone.js/dist/zone-error';
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';
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';
86
73
  import { Platform as Platform$1 } from '@angular/cdk/platform';
87
- import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
74
+ import { InAppBrowser as InAppBrowser$1 } from '@ionic-native/in-app-browser/ngx';
88
75
  import { ApolloLink, NetworkStatus, InMemoryCache, ApolloClient, gql } from '@apollo/client/core';
89
- import * as i2$3 from 'apollo-angular';
90
76
  import { Apollo } from 'apollo-angular';
91
77
  import { WebSocketLink } from '@apollo/client/link/ws';
92
78
  import { getMainDefinition } from '@apollo/client/utilities';
@@ -94,14 +80,13 @@ import { RetryLink } from '@apollo/client/link/retry';
94
80
  import QueueLink from 'apollo-link-queue';
95
81
  import SerializingLink from 'apollo-link-serialize';
96
82
  import loggerLink from 'apollo-link-logger';
97
- import * as i3$2 from 'apollo-angular/http';
98
83
  import { HttpLink } from 'apollo-angular/http';
99
84
  import { IonicStorageWrapper, persistCache } from 'apollo3-cache-persist';
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';
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';
105
90
  import { CdkTextareaAutosize } from '@angular/cdk/text-field';
106
91
  import { ValidatorService, TableDataSource } from '@e-is/ngx-material-table';
107
92
  import { SelectionModel } from '@angular/cdk/collections';
@@ -1069,6 +1054,10 @@ trigger('slideUpDownAnimation', [
1069
1054
  /* ---
1070
1055
  * Source: https://github.com/ionic-team/ionic-framework/blob/b0d53ca73619585671d8cf4dc24e47f826495a0a/core/src/utils/platform.ts
1071
1056
  * --- */
1057
+ const _cache = {
1058
+ mobile: null,
1059
+ cordova: null
1060
+ };
1072
1061
  const matchMedia = (win, query) => win.matchMedia(query).matches;
1073
1062
  const testUserAgent = (win, expr) => {
1074
1063
  const userAgent = win.navigator.userAgent || win.navigator.vendor || window.opera;
@@ -1076,22 +1065,34 @@ const testUserAgent = (win, expr) => {
1076
1065
  };
1077
1066
  const isWindows = (win) => testUserAgent(win, /windows/i);
1078
1067
  const isTouchUi = (win) => matchMedia(win, '(any-pointer:coarse)');
1079
- const isMobile = (win) => isCordova(window) || isAndroid(win) || isIOS(window) || (isTouchUi(win) && !isWindows(win));
1080
1068
  const isIpad = (win) => {
1081
1069
  // iOS 12 and below
1082
1070
  if (testUserAgent(win, /iPad/i)) {
1083
1071
  return true;
1084
1072
  }
1085
1073
  // iOS 13+
1086
- if (testUserAgent(win, /Macintosh/i) && isMobile(win)) {
1074
+ if (testUserAgent(win, /Macintosh/i) && isTouchUi(win)) {
1087
1075
  return true;
1088
1076
  }
1089
1077
  return false;
1090
1078
  };
1091
- const ɵ0$c = isIpad;
1079
+ const ɵ0 = isIpad;
1092
1080
  const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
1093
1081
  const isAndroid = (win) => testUserAgent(win, /android|sink/i);
1094
- const isCordova = (win) => !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);
1082
+ const isCordova = (win) => {
1083
+ if (_cache.cordova === null || _cache.cordova === undefined) {
1084
+ _cache.cordova = !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);
1085
+ }
1086
+ return _cache.cordova;
1087
+ };
1088
+ const isMobile = (win) => {
1089
+ if (_cache.mobile === null || _cache.mobile === undefined) {
1090
+ _cache.mobile = isCordova(window)
1091
+ || isAndroid(win) || isIOS(window)
1092
+ || (isTouchUi(win) && !isWindows(win));
1093
+ }
1094
+ return _cache.mobile;
1095
+ };
1095
1096
 
1096
1097
  class MatAutocompleteConfigHolder {
1097
1098
  constructor(options) {
@@ -1147,14 +1148,14 @@ class MatAutocompleteFieldUtils {
1147
1148
  return isNotNil(o1 === null || o1 === void 0 ? void 0 : o1.id) && o1.id === (o2 === null || o2 === void 0 ? void 0 : o2.id);
1148
1149
  }
1149
1150
  }
1150
- const noop$8 = (_) => { };
1151
- const ɵ0$b = noop$8;
1151
+ const noop = (_) => { };
1152
+ const ɵ0$1 = noop;
1152
1153
  class MatAutocompleteField {
1153
1154
  constructor(cd, formGroupDir) {
1154
1155
  this.cd = cd;
1155
1156
  this.formGroupDir = formGroupDir;
1156
- this._onChangeCallback = noop$8;
1157
- this._onTouchedCallback = noop$8;
1157
+ this._onChangeCallback = noop;
1158
+ this._onTouchedCallback = noop;
1158
1159
  this.logPrefix = '[mat-autocomplete] ';
1159
1160
  this.formControlName = null;
1160
1161
  this.required = false;
@@ -1903,7 +1904,7 @@ class DateFormatPipe {
1903
1904
  return isMoment(value) ? value : this.dateAdapter.parse(value, parseFormat || DATE_ISO_PATTERN);
1904
1905
  }
1905
1906
  }
1906
- DateFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(i0.ɵɵinject(i1.MomentDateAdapter), i0.ɵɵinject(i1$1.TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1907
+ DateFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(ɵɵinject(MomentDateAdapter), ɵɵinject(TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1907
1908
  DateFormatPipe.decorators = [
1908
1909
  { type: Pipe, args: [{
1909
1910
  name: 'dateFormat'
@@ -1915,7 +1916,7 @@ DateFormatPipe.ctorParameters = () => [
1915
1916
  { type: TranslateService }
1916
1917
  ];
1917
1918
 
1918
- const moment$7 = momentImported;
1919
+ const moment = momentImported;
1919
1920
  class DateDiffDurationPipe {
1920
1921
  constructor(dateAdapter, translate) {
1921
1922
  this.dateAdapter = dateAdapter;
@@ -1931,17 +1932,17 @@ class DateDiffDurationPipe {
1931
1932
  return this.format(startDate, endDate);
1932
1933
  }
1933
1934
  format(startDate, endDate) {
1934
- const duration = moment$7.duration(endDate.diff(startDate));
1935
+ const duration = moment.duration(endDate.diff(startDate));
1935
1936
  if (duration.asMinutes() < 0)
1936
1937
  return '';
1937
- const timeDuration = moment$7(0)
1938
+ const timeDuration = moment(0)
1938
1939
  .hour(duration.hours())
1939
1940
  .minute(duration.minutes());
1940
1941
  const days = Math.floor(duration.asDays());
1941
1942
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + timeDuration.format('HH:mm');
1942
1943
  }
1943
1944
  }
1944
- 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" });
1945
+ DateDiffDurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateDiffDurationPipe_Factory() { return new DateDiffDurationPipe(ɵɵinject(DateAdapter), ɵɵinject(TranslateService)); }, token: DateDiffDurationPipe, providedIn: "root" });
1945
1946
  DateDiffDurationPipe.decorators = [
1946
1947
  { type: Pipe, args: [{
1947
1948
  name: 'dateDiffDuration'
@@ -1962,7 +1963,7 @@ class DateFromNowPipe {
1962
1963
  return date ? date.fromNow(args && args.withoutSuffix) : '';
1963
1964
  }
1964
1965
  }
1965
- DateFromNowPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(i0.ɵɵinject(i1.MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
1966
+ DateFromNowPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(ɵɵinject(MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
1966
1967
  DateFromNowPipe.decorators = [
1967
1968
  { type: Pipe, args: [{
1968
1969
  name: 'dateFromNow'
@@ -2031,7 +2032,7 @@ function formatToDD(value, opts) {
2031
2032
  value *= -1;
2032
2033
  }
2033
2034
  }
2034
- let degrees = roundFloat$1(value, opts.maxDecimals).toString();
2035
+ let degrees = roundFloat(value, opts.maxDecimals).toString();
2035
2036
  // Add sign
2036
2037
  let sign = negative ? '-' : '+';
2037
2038
  if (opts.placeholderChar) {
@@ -2082,7 +2083,7 @@ function formatToDDMMSS(value, opts) {
2082
2083
  }
2083
2084
  let degrees = Math.trunc(value);
2084
2085
  let minutes = Math.trunc((value - degrees) * 60);
2085
- let seconds = roundFloat$1(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
2086
+ let seconds = roundFloat(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
2086
2087
  while (seconds >= 60) {
2087
2088
  seconds -= 60;
2088
2089
  minutes += 1;
@@ -2150,7 +2151,7 @@ function formatToDDMM(value, opts) {
2150
2151
  }
2151
2152
  }
2152
2153
  let degrees = Math.trunc(value);
2153
- let minutes = roundFloat$1((value - degrees) * 60, opts.maxDecimals);
2154
+ let minutes = roundFloat((value - degrees) * 60, opts.maxDecimals);
2154
2155
  while (minutes >= 60) {
2155
2156
  minutes -= 60;
2156
2157
  degrees += 1;
@@ -2201,15 +2202,15 @@ function parseLatitudeOrLongitude(input, pattern, maxDecimals, placeholderChar)
2201
2202
  return NaN;
2202
2203
  }
2203
2204
  if (pattern === 'DD')
2204
- return roundFloat$1(degrees, maxDecimals);
2205
+ return roundFloat(degrees, maxDecimals);
2205
2206
  const minutes = (pattern === 'DDMMSS' || pattern === 'DDMM') && parts[1] && parseFloat(parts[1].replace(/,/g, '.')) || 0;
2206
2207
  const seconds = (pattern === 'DDMMSS') && parts[2] && parseFloat(parts[2].replace(/,/g, '.')) || 0;
2207
2208
  const direction = ((pattern === 'DDMMSS') && parts[3]) || ((pattern === 'DDMM') && parts[2]) || undefined;
2208
2209
  const sign = (direction && (direction === 's' || direction === 'S' || direction === 'w' || direction === 'W')) ? -1 : 1;
2209
2210
  degrees = sign * (degrees + minutes / 60 + seconds / (60 * 60));
2210
- return roundFloat$1(degrees, maxDecimals);
2211
+ return roundFloat(degrees, maxDecimals);
2211
2212
  }
2212
- function roundFloat$1(input, maxDecimals) {
2213
+ function roundFloat(input, maxDecimals) {
2213
2214
  if (maxDecimals > 0) {
2214
2215
  const powDecimal = Math.pow(10, maxDecimals);
2215
2216
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -2229,7 +2230,7 @@ class LatLongFormatPipe {
2229
2230
  return ((!args.type || args.type !== 'latitude') ? formatLongitude : formatLatitude)(value, args);
2230
2231
  }
2231
2232
  }
2232
- LatLongFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function LatLongFormatPipe_Factory() { return new LatLongFormatPipe(); }, token: LatLongFormatPipe, providedIn: "root" });
2233
+ LatLongFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LatLongFormatPipe_Factory() { return new LatLongFormatPipe(); }, token: LatLongFormatPipe, providedIn: "root" });
2233
2234
  LatLongFormatPipe.decorators = [
2234
2235
  { type: Pipe, args: [{
2235
2236
  name: 'latLongFormat'
@@ -2241,7 +2242,7 @@ class LatitudeFormatPipe {
2241
2242
  this.transform = formatLatitude;
2242
2243
  }
2243
2244
  }
2244
- LatitudeFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function LatitudeFormatPipe_Factory() { return new LatitudeFormatPipe(); }, token: LatitudeFormatPipe, providedIn: "root" });
2245
+ LatitudeFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LatitudeFormatPipe_Factory() { return new LatitudeFormatPipe(); }, token: LatitudeFormatPipe, providedIn: "root" });
2245
2246
  LatitudeFormatPipe.decorators = [
2246
2247
  { type: Pipe, args: [{
2247
2248
  name: 'latitudeFormat'
@@ -2253,7 +2254,7 @@ class LongitudeFormatPipe {
2253
2254
  this.transform = formatLongitude;
2254
2255
  }
2255
2256
  }
2256
- LongitudeFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function LongitudeFormatPipe_Factory() { return new LongitudeFormatPipe(); }, token: LongitudeFormatPipe, providedIn: "root" });
2257
+ LongitudeFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LongitudeFormatPipe_Factory() { return new LongitudeFormatPipe(); }, token: LongitudeFormatPipe, providedIn: "root" });
2257
2258
  LongitudeFormatPipe.decorators = [
2258
2259
  { type: Pipe, args: [{
2259
2260
  name: 'longitudeFormat'
@@ -2273,7 +2274,7 @@ class NumberFormatPipe {
2273
2274
  }
2274
2275
  }
2275
2276
  }
2276
- NumberFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2277
+ NumberFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2277
2278
  NumberFormatPipe.decorators = [
2278
2279
  { type: Pipe, args: [{
2279
2280
  name: 'numberFormat'
@@ -2313,7 +2314,7 @@ class HighlightPipe {
2313
2314
  }
2314
2315
  }
2315
2316
  }
2316
- HighlightPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2317
+ HighlightPipe.ɵprov = ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2317
2318
  HighlightPipe.decorators = [
2318
2319
  { type: Pipe, args: [{
2319
2320
  name: 'highlight'
@@ -2378,7 +2379,7 @@ FileSizePipe.decorators = [
2378
2379
  { type: Pipe, args: [{ name: 'fileSize' },] }
2379
2380
  ];
2380
2381
 
2381
- const moment$6 = momentImported;
2382
+ const moment$1 = momentImported;
2382
2383
  const tz = momentTZImported;
2383
2384
  const DATE_UNIX_TIMESTAMP = 'X';
2384
2385
  const DATE_UNIX_MS_TIMESTAMP = 'x';
@@ -2455,32 +2456,32 @@ function fromDateISOString(value) {
2455
2456
  if (!value || isMoment(value))
2456
2457
  return value;
2457
2458
  // Parse the input value, as a ISO date time
2458
- const date = moment$6(value, DATE_ISO_PATTERN);
2459
+ const date = moment$1(value, DATE_ISO_PATTERN);
2459
2460
  if (date.isValid())
2460
2461
  return date;
2461
2462
  // Not valid: trying to convert from unix timestamp
2462
2463
  if (typeof value === 'string') {
2463
2464
  console.warn('Wrong date format - Trying to convert from local time: ' + value);
2464
2465
  if (value.length === 10) {
2465
- return moment$6(value, DATE_UNIX_TIMESTAMP);
2466
+ return moment$1(value, DATE_UNIX_TIMESTAMP);
2466
2467
  }
2467
2468
  else if (value.length === 13) {
2468
- return moment$6(value, DATE_UNIX_MS_TIMESTAMP);
2469
+ return moment$1(value, DATE_UNIX_MS_TIMESTAMP);
2469
2470
  }
2470
2471
  }
2471
2472
  console.warn('Unable to parse date: ' + value);
2472
2473
  return undefined;
2473
2474
  }
2474
2475
  function fromUnixTimestamp(timeInSec) {
2475
- return moment$6(timeInSec, DATE_UNIX_TIMESTAMP);
2476
+ return moment$1(timeInSec, DATE_UNIX_TIMESTAMP);
2476
2477
  }
2477
2478
  function fromUnixMsTimestamp(timeInMs) {
2478
- return moment$6(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2479
+ return moment$1(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2479
2480
  }
2480
2481
  function toDuration(value, unit) {
2481
2482
  if (!value)
2482
2483
  return undefined;
2483
- const duration = moment$6.duration(value, unit);
2484
+ const duration = moment$1.duration(value, unit);
2484
2485
  // fix 990+ ms
2485
2486
  if (duration.milliseconds() >= 990) {
2486
2487
  duration.add(1000 - duration.milliseconds(), 'ms');
@@ -2509,7 +2510,7 @@ class DurationPipe {
2509
2510
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + hour + ':' + minute;
2510
2511
  }
2511
2512
  }
2512
- DurationPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(i0.ɵɵinject(i1$1.TranslateService)); }, token: DurationPipe, providedIn: "root" });
2513
+ DurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(ɵɵinject(TranslateService)); }, token: DurationPipe, providedIn: "root" });
2513
2514
  DurationPipe.decorators = [
2514
2515
  { type: Pipe, args: [{
2515
2516
  name: 'duration'
@@ -2530,7 +2531,7 @@ class MathAbsPipe {
2530
2531
  }
2531
2532
  }
2532
2533
  }
2533
- MathAbsPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2534
+ MathAbsPipe.ɵprov = ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2534
2535
  MathAbsPipe.decorators = [
2535
2536
  { type: Pipe, args: [{
2536
2537
  name: 'mathAbs'
@@ -2542,7 +2543,7 @@ class EvenPipe {
2542
2543
  return val % 2 === 0;
2543
2544
  }
2544
2545
  }
2545
- EvenPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2546
+ EvenPipe.ɵprov = ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2546
2547
  EvenPipe.decorators = [
2547
2548
  { type: Pipe, args: [{
2548
2549
  name: 'even'
@@ -2554,7 +2555,7 @@ class OddPipe {
2554
2555
  return val % 2 !== 0;
2555
2556
  }
2556
2557
  }
2557
- OddPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2558
+ OddPipe.ɵprov = ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2558
2559
  OddPipe.decorators = [
2559
2560
  { type: Pipe, args: [{
2560
2561
  name: 'odd'
@@ -2662,7 +2663,7 @@ class MapGetPipe {
2662
2663
  return val[key];
2663
2664
  }
2664
2665
  }
2665
- MapGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2666
+ MapGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2666
2667
  MapGetPipe.decorators = [
2667
2668
  { type: Pipe, args: [{
2668
2669
  name: 'mapGet'
@@ -2676,7 +2677,7 @@ class MapKeysPipe {
2676
2677
  return Object.keys(map);
2677
2678
  }
2678
2679
  }
2679
- MapKeysPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2680
+ MapKeysPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2680
2681
  MapKeysPipe.decorators = [
2681
2682
  { type: Pipe, args: [{
2682
2683
  name: 'mapKeys'
@@ -2690,7 +2691,7 @@ class MapValuesPipe {
2690
2691
  return Object.values(map);
2691
2692
  }
2692
2693
  }
2693
- MapValuesPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2694
+ MapValuesPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2694
2695
  MapValuesPipe.decorators = [
2695
2696
  { type: Pipe, args: [{
2696
2697
  name: 'mapValues'
@@ -2703,7 +2704,7 @@ class IsNotNilOrBlankPipe {
2703
2704
  return isNotNilOrBlank(value);
2704
2705
  }
2705
2706
  }
2706
- IsNotNilOrBlankPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotNilOrBlankPipe_Factory() { return new IsNotNilOrBlankPipe(); }, token: IsNotNilOrBlankPipe, providedIn: "root" });
2707
+ IsNotNilOrBlankPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotNilOrBlankPipe_Factory() { return new IsNotNilOrBlankPipe(); }, token: IsNotNilOrBlankPipe, providedIn: "root" });
2707
2708
  IsNotNilOrBlankPipe.decorators = [
2708
2709
  { type: Pipe, args: [{
2709
2710
  name: 'isNotNilOrBlank'
@@ -2715,7 +2716,7 @@ class IsNilOrBlankPipe {
2715
2716
  return isNilOrBlank(value);
2716
2717
  }
2717
2718
  }
2718
- IsNilOrBlankPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNilOrBlankPipe_Factory() { return new IsNilOrBlankPipe(); }, token: IsNilOrBlankPipe, providedIn: "root" });
2719
+ IsNilOrBlankPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNilOrBlankPipe_Factory() { return new IsNilOrBlankPipe(); }, token: IsNilOrBlankPipe, providedIn: "root" });
2719
2720
  IsNilOrBlankPipe.decorators = [
2720
2721
  { type: Pipe, args: [{
2721
2722
  name: 'isNilOrBlank'
@@ -2727,7 +2728,7 @@ class ToStringPipe {
2727
2728
  return (value !== null && value !== undefined) ? value.toString() : '';
2728
2729
  }
2729
2730
  }
2730
- ToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function ToStringPipe_Factory() { return new ToStringPipe(); }, token: ToStringPipe, providedIn: "root" });
2731
+ ToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function ToStringPipe_Factory() { return new ToStringPipe(); }, token: ToStringPipe, providedIn: "root" });
2731
2732
  ToStringPipe.decorators = [
2732
2733
  { type: Pipe, args: [{
2733
2734
  name: 'toString'
@@ -2739,7 +2740,7 @@ class StrLengthPipe {
2739
2740
  return value && value.length || 0;
2740
2741
  }
2741
2742
  }
2742
- StrLengthPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function StrLengthPipe_Factory() { return new StrLengthPipe(); }, token: StrLengthPipe, providedIn: "root" });
2743
+ StrLengthPipe.ɵprov = ɵɵdefineInjectable({ factory: function StrLengthPipe_Factory() { return new StrLengthPipe(); }, token: StrLengthPipe, providedIn: "root" });
2743
2744
  StrLengthPipe.decorators = [
2744
2745
  { type: Pipe, args: [{
2745
2746
  name: 'strLength'
@@ -2751,7 +2752,7 @@ class StrIncludesPipe {
2751
2752
  return (value === null || value === void 0 ? void 0 : value.includes(searchString, position)) || false;
2752
2753
  }
2753
2754
  }
2754
- StrIncludesPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function StrIncludesPipe_Factory() { return new StrIncludesPipe(); }, token: StrIncludesPipe, providedIn: "root" });
2755
+ StrIncludesPipe.ɵprov = ɵɵdefineInjectable({ factory: function StrIncludesPipe_Factory() { return new StrIncludesPipe(); }, token: StrIncludesPipe, providedIn: "root" });
2755
2756
  StrIncludesPipe.decorators = [
2756
2757
  { type: Pipe, args: [{
2757
2758
  name: 'strIncludes'
@@ -2828,7 +2829,7 @@ class TranslateContextService {
2828
2829
  return translations[keys[keys.length - 1]]; // Return the last keys translation
2829
2830
  }
2830
2831
  }
2831
- TranslateContextService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(i0.ɵɵinject(i1$1.TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2832
+ TranslateContextService.ɵprov = ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(ɵɵinject(TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2832
2833
  TranslateContextService.decorators = [
2833
2834
  { type: Injectable, args: [{ providedIn: 'root' },] }
2834
2835
  ];
@@ -2878,7 +2879,7 @@ class PropertyGetPipe {
2878
2879
  args && args.defaultValue);
2879
2880
  }
2880
2881
  }
2881
- PropertyGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PropertyGetPipe_Factory() { return new PropertyGetPipe(); }, token: PropertyGetPipe, providedIn: "root" });
2882
+ PropertyGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function PropertyGetPipe_Factory() { return new PropertyGetPipe(); }, token: PropertyGetPipe, providedIn: "root" });
2882
2883
  PropertyGetPipe.decorators = [
2883
2884
  { type: Pipe, args: [{
2884
2885
  name: 'propertyGet'
@@ -2903,7 +2904,7 @@ NgInitDirective.propDecorators = {
2903
2904
  ngInit: [{ type: Output }]
2904
2905
  };
2905
2906
 
2906
- const moment$5 = momentImported;
2907
+ const moment$2 = momentImported;
2907
2908
  // @dynamic
2908
2909
  class SharedValidators {
2909
2910
  static getDoubleRegexp(maxDecimals) {
@@ -2984,7 +2985,7 @@ class SharedValidators {
2984
2985
  }
2985
2986
  static validDate(control) {
2986
2987
  const value = control.value;
2987
- const date = !value || moment$5.isMoment(value) ? value : moment$5(control.value, DATE_ISO_PATTERN);
2988
+ const date = !value || moment$2.isMoment(value) ? value : moment$2(value, DATE_ISO_PATTERN);
2988
2989
  if (date && (!date.isValid() || date.year() < 1970)) {
2989
2990
  return { validDate: true };
2990
2991
  }
@@ -4096,7 +4097,7 @@ class FormErrorTranslator {
4096
4097
  return errorKey;
4097
4098
  }
4098
4099
  }
4099
- 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" });
4100
+ FormErrorTranslator.ɵprov = ɵɵdefineInjectable({ factory: function FormErrorTranslator_Factory() { return new FormErrorTranslator(ɵɵinject(TranslateService), ɵɵinject(APP_FORM_ERROR_I18N_KEYS, 8)); }, token: FormErrorTranslator, providedIn: "root" });
4100
4101
  FormErrorTranslator.decorators = [
4101
4102
  { type: Injectable, args: [{ providedIn: 'root' },] }
4102
4103
  ];
@@ -4176,7 +4177,7 @@ class FormGetPipe {
4176
4177
  return form.get(path);
4177
4178
  }
4178
4179
  }
4179
- FormGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormGetPipe_Factory() { return new FormGetPipe(); }, token: FormGetPipe, providedIn: "root" });
4180
+ FormGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetPipe_Factory() { return new FormGetPipe(); }, token: FormGetPipe, providedIn: "root" });
4180
4181
  FormGetPipe.decorators = [
4181
4182
  { type: Pipe, args: [{
4182
4183
  name: 'formGet'
@@ -4188,7 +4189,7 @@ class FormGetControlPipe {
4188
4189
  return form.get(path);
4189
4190
  }
4190
4191
  }
4191
- FormGetControlPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormGetControlPipe_Factory() { return new FormGetControlPipe(); }, token: FormGetControlPipe, providedIn: "root" });
4192
+ FormGetControlPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetControlPipe_Factory() { return new FormGetControlPipe(); }, token: FormGetControlPipe, providedIn: "root" });
4192
4193
  FormGetControlPipe.decorators = [
4193
4194
  { type: Pipe, args: [{
4194
4195
  name: 'formGetControl'
@@ -4200,7 +4201,7 @@ class FormGetArrayPipe {
4200
4201
  return form.get(path);
4201
4202
  }
4202
4203
  }
4203
- FormGetArrayPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormGetArrayPipe_Factory() { return new FormGetArrayPipe(); }, token: FormGetArrayPipe, providedIn: "root" });
4204
+ FormGetArrayPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetArrayPipe_Factory() { return new FormGetArrayPipe(); }, token: FormGetArrayPipe, providedIn: "root" });
4204
4205
  FormGetArrayPipe.decorators = [
4205
4206
  { type: Pipe, args: [{
4206
4207
  name: 'formGetArray'
@@ -4212,7 +4213,7 @@ class FormGetGroupPipe {
4212
4213
  return form.get(path);
4213
4214
  }
4214
4215
  }
4215
- FormGetGroupPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormGetGroupPipe_Factory() { return new FormGetGroupPipe(); }, token: FormGetGroupPipe, providedIn: "root" });
4216
+ FormGetGroupPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetGroupPipe_Factory() { return new FormGetGroupPipe(); }, token: FormGetGroupPipe, providedIn: "root" });
4216
4217
  FormGetGroupPipe.decorators = [
4217
4218
  { type: Pipe, args: [{
4218
4219
  name: 'formGetGroup'
@@ -4541,9 +4542,9 @@ function parseDuration(input, maxDecimals, placeholderChar) {
4541
4542
  const hour = parseInt(durationParts[0] || '0');
4542
4543
  const minute = parseInt(durationParts[1] || '0');
4543
4544
  const value = hour + (minute + 0.5) / 60;
4544
- return roundFloat(value, maxDecimals);
4545
+ return roundFloat$1(value, maxDecimals);
4545
4546
  }
4546
- function roundFloat(input, maxDecimals) {
4547
+ function roundFloat$1(input, maxDecimals) {
4547
4548
  if (maxDecimals > 0) {
4548
4549
  const powDecimal = Math.pow(10, maxDecimals);
4549
4550
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -4567,17 +4568,17 @@ const MASKS = {
4567
4568
  DD: [/[+-]/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '°']
4568
4569
  }
4569
4570
  };
4570
- const noop$7 = () => {
4571
+ const noop$1 = () => {
4571
4572
  };
4572
- const ɵ0$a = noop$7;
4573
+ const ɵ0$2 = noop$1;
4573
4574
  class MatLatLongField {
4574
4575
  constructor(translate, formBuilder, cd, formGroupDir) {
4575
4576
  this.translate = translate;
4576
4577
  this.formBuilder = formBuilder;
4577
4578
  this.cd = cd;
4578
4579
  this.formGroupDir = formGroupDir;
4579
- this._onChangeCallback = noop$7;
4580
- this._onTouchedCallback = noop$7;
4580
+ this._onChangeCallback = noop$1;
4581
+ this._onTouchedCallback = noop$1;
4581
4582
  this._subscription = new Subscription();
4582
4583
  this.disabling = false;
4583
4584
  this.writing = false;
@@ -4913,14 +4914,14 @@ SharedMatLatLongModule.decorators = [
4913
4914
  },] }
4914
4915
  ];
4915
4916
 
4916
- const DEFAULT_VALUE_ACCESSOR$5 = {
4917
+ const DEFAULT_VALUE_ACCESSOR = {
4917
4918
  provide: NG_VALUE_ACCESSOR,
4918
4919
  useExisting: forwardRef(() => MatDate),
4919
4920
  multi: true
4920
4921
  };
4921
- const DAY_MASK$2 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
4922
- const noop$6 = () => { };
4923
- const ɵ0$9 = noop$6;
4922
+ const TEXT_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
4923
+ const noop$2 = () => { };
4924
+ const ɵ0$3 = noop$2;
4924
4925
  class MatDate {
4925
4926
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
4926
4927
  this.dateAdapter = dateAdapter;
@@ -4929,13 +4930,13 @@ class MatDate {
4929
4930
  this.cd = cd;
4930
4931
  this.keyboard = keyboard;
4931
4932
  this.formGroupDir = formGroupDir;
4932
- this._onChangeCallback = noop$6;
4933
- this._onTouchedCallback = noop$6;
4933
+ this._onChangeCallback = noop$2;
4934
+ this._onTouchedCallback = noop$2;
4934
4935
  this._subscription = new Subscription();
4935
4936
  this._writing = true;
4936
4937
  this._disabling = false;
4937
4938
  this._readonly = false;
4938
- this.dayMask = DAY_MASK$2;
4939
+ this.mask = TEXT_MASK;
4939
4940
  this.floatLabel = 'auto';
4940
4941
  this.compact = false;
4941
4942
  this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
@@ -4980,22 +4981,24 @@ class MatDate {
4980
4981
  this.formControl.setValidators(this.required ? [this.formControl.validator, Validators.required, SharedValidators.validDate] :
4981
4982
  [this.formControl.validator, SharedValidators.validDate]);
4982
4983
  }
4983
- // Create the day control
4984
- this.dayControl = this.formBuilder.control(null, () => this.formControl.errors);
4984
+ // Create the text control
4985
+ this.textControl = this.formBuilder.control(null,
4986
+ // Important: should copy errors from the model formControl
4987
+ () => this.formControl.errors);
4985
4988
  // Get patterns to display date
4986
4989
  this.updatePattern(this.translate.instant('COMMON.DATE_PATTERN'));
4987
4990
  this._subscription.add(this.translate.get('COMMON.DATE_PATTERN')
4988
4991
  .subscribe((pattern) => this.updatePattern(pattern)));
4989
- this._subscription.add(this.dayControl.valueChanges
4992
+ this._subscription.add(this.textControl.valueChanges
4990
4993
  .subscribe((value) => this.onFormChange(value)));
4991
4994
  // Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
4992
4995
  this._subscription.add(this.formControl.statusChanges
4993
4996
  .pipe(filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip
4994
4997
  )
4995
4998
  .subscribe(() => {
4996
- this.dayControl.updateValueAndValidity({ emitEvent: false });
4997
- if (this.formControl.touched && !this.dayControl.touched) {
4998
- this.dayControl.markAsTouched();
4999
+ this.textControl.updateValueAndValidity({ emitEvent: false });
5000
+ if (this.formControl.touched && !this.textControl.touched) {
5001
+ this.textControl.markAsTouched();
4999
5002
  }
5000
5003
  this.markForCheck();
5001
5004
  }));
@@ -5011,27 +5014,25 @@ class MatDate {
5011
5014
  this._writing = true;
5012
5015
  // DEBUG
5013
5016
  //console.debug("[mat-date] writeValue() with:", value);
5014
- // Convert into date, and clone if necessary
5015
- const date = isMoment(value) ? value.clone() : fromDateISOString(value);
5017
+ // Convert into date
5018
+ // Important: do a clone()
5019
+ let date = isMoment(value) ? value.clone() : fromDateISOString(value);
5016
5020
  if (!date || !date.isValid()) {
5017
- this.dayControl.patchValue(null, { emitEvent: false });
5021
+ this.textControl.patchValue(null, { emitEvent: false });
5018
5022
  if (this.formControl.value) {
5019
5023
  this.formControl.patchValue(null, { emitEvent: false });
5020
5024
  this._onChangeCallback(null);
5021
5025
  }
5022
5026
  }
5023
5027
  else {
5024
- // Format day
5025
- let day = date && this.timezone
5026
- // Move to the expected TZ (keeping local hour - e.g. midnight)
5027
- ? date.tz(this.timezone)
5028
- // Not TZ: important: do a clone
5029
- : date;
5030
- day = day.startOf('day');
5031
- const dayStr = this.dateAdapter.format(day, this.dayPattern);
5032
- if (this.dayControl.value !== dayStr) {
5033
- // Update control
5034
- this.dayControl.patchValue(dayStr, { emitEvent: false });
5028
+ // Move to the expected TZ (keeping local hour - e.g. midnight)
5029
+ date = (this.timezone && date.tz(this.timezone) || date)
5030
+ // Reset hour
5031
+ .startOf('day');
5032
+ const dayStr = this.dateAdapter.format(date, this.datePattern);
5033
+ if (this.textControl.value !== dayStr) {
5034
+ // Update day control
5035
+ this.textControl.patchValue(dayStr, { emitEvent: false });
5035
5036
  }
5036
5037
  }
5037
5038
  this._writing = false;
@@ -5048,10 +5049,10 @@ class MatDate {
5048
5049
  return;
5049
5050
  this._disabling = true;
5050
5051
  if (isDisabled) {
5051
- this.dayControl.disable({ emitEvent: false });
5052
+ this.textControl.disable({ emitEvent: false });
5052
5053
  }
5053
5054
  else {
5054
- this.dayControl.enable({ emitEvent: false });
5055
+ this.textControl.enable({ emitEvent: false });
5055
5056
  }
5056
5057
  this._disabling = false;
5057
5058
  this.markForCheck();
@@ -5068,12 +5069,12 @@ class MatDate {
5068
5069
  .locale(this.locale) // set as time as locale time
5069
5070
  .minute(0).seconds(0).millisecond(0) // Reset hour
5070
5071
  .utc(true);
5071
- dateStr = this.dateAdapter.format(date, this.dayPattern) || null;
5072
+ dateStr = this.dateAdapter.format(date, this.datePattern) || null;
5072
5073
  }
5073
- if (this.dayControl.value !== dateStr) {
5074
+ if (this.textControl.value !== dateStr) {
5074
5075
  // DEBUG
5075
5076
  //console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
5076
- this.dayControl.setValue(dateStr, {
5077
+ this.textControl.setValue(dateStr, {
5077
5078
  emitEvent: true // Will call onFormChange
5078
5079
  });
5079
5080
  }
@@ -5118,7 +5119,7 @@ class MatDate {
5118
5119
  });
5119
5120
  }
5120
5121
  clear() {
5121
- this.dayControl.patchValue(null, { emitEvent: false });
5122
+ this.textControl.patchValue(null, { emitEvent: false });
5122
5123
  this.formControl.setValue(null, { emitEvent: false });
5123
5124
  this._onChangeCallback(null);
5124
5125
  this.markAsTouched();
@@ -5127,43 +5128,70 @@ class MatDate {
5127
5128
  /* -- private method -- */
5128
5129
  updatePattern(pattern) {
5129
5130
  pattern = pattern !== 'COMMON.DATE_PATTERN' ? pattern : 'L';
5130
- if (this.displayPattern !== pattern) {
5131
- this.displayPattern = pattern;
5132
- this.dayPattern = pattern;
5131
+ if (this.datePattern !== pattern) {
5132
+ this.datePattern = pattern;
5133
5133
  this.markForCheck();
5134
5134
  }
5135
5135
  }
5136
5136
  checkIfTouched(opts) {
5137
- if (this.dayControl.touched) {
5137
+ if (this.textControl.touched) {
5138
5138
  this._onTouchedCallback();
5139
5139
  if (!opts || opts.emitEvent !== false) {
5140
5140
  this.markForCheck();
5141
5141
  }
5142
5142
  }
5143
5143
  }
5144
- onFormChange(dayStr) {
5144
+ onFormChange(value) {
5145
5145
  if (this._writing)
5146
5146
  return; // Skip if call by self
5147
5147
  this._writing = true;
5148
- if (this.dayControl.invalid) {
5149
- this.formControl.markAsPending({ onlySelf: true });
5150
- this.formControl.setErrors(Object.assign(Object.assign({}, this.formControl.errors), this.dayControl.errors));
5151
- this.formControl.markAsDirty();
5152
- this._writing = false;
5153
- return;
5154
- }
5155
- // Make to remove placeholder chars
5156
- while (dayStr && dayStr.indexOf(this.placeholderChar) !== -1) {
5157
- dayStr = dayStr.replace(this.placeholderChar, '');
5148
+ // DEBUG
5149
+ //console.debug(`[mat-date-time] onFormChange() from event: ${event} - controls values: `, [dayStr, time]);
5150
+ /*if (this.dayControl.invalid) {
5151
+ this.formControl.markAsPending({onlySelf: true});
5152
+ this.formControl.setErrors({
5153
+ ...this.formControl.errors,
5154
+ ...this.dayControl.errors
5155
+ });
5156
+ this.formControl.markAsDirty();
5157
+ this._writing = false;
5158
+ return;
5159
+ }*/
5160
+ if (value) {
5161
+ // Make to remove placeholder chars
5162
+ while (value.indexOf(this.placeholderChar) !== -1) {
5163
+ value = value.replace(this.placeholderChar, '');
5164
+ }
5165
+ // Force '0' for empty month (otherwise moment will use the current month)
5166
+ value = value.replace('//', '/0/')
5167
+ // Force '0' for empty year (otherwise moment will use the current year)
5168
+ .replace(/\/$/, '/0');
5158
5169
  }
5159
- // Parse day
5160
- let dayDate = dayStr && this.dateAdapter.parse(dayStr, this.dayPattern);
5170
+ // Parse date (strict = false)
5171
+ let date = isNotNilOrBlank(value) && this.dateAdapter.parse(value, this.datePattern) || null;
5161
5172
  // Move to the expected TZ, and keep the local hour (= midnight) to have midnight at local time
5162
- dayDate = dayDate && (this.timezone ? dayDate.tz(this.timezone, true) : dayDate);
5163
- dayDate = dayDate && dayDate
5173
+ date = date && (this.timezone ? date.tz(this.timezone, true) : date) || null;
5174
+ date = date && date
5164
5175
  .startOf('day') // Reset hour
5165
- .utc(); // Convert to UTC (avoid TZ offset in final string)
5166
- this.emitChange(dayDate);
5176
+ .utc() // Convert to UTC (avoid TZ offset in final string)
5177
+ || null;
5178
+ // Convert to model value (ISO date string)
5179
+ // IMPORTANT: If date is invalid, then keep the invalid string value
5180
+ // to allow SharedValidators.validDate() to raise an error
5181
+ const formControlValue = date && date.isValid() ? toDateISOString(date) : (value || null);
5182
+ if (this.formControl.value !== formControlValue) {
5183
+ // DEBUG
5184
+ //console.debug('[mat-date] Emit new value: ' + dateStr);
5185
+ // Apply to form control. => Will call writeValue()
5186
+ // NOT NEED, because a formControl should NOT be used by multiple fields
5187
+ //this.formControl.setValue(dateStr, {emitEvent: false})
5188
+ // Changes comes from inside function: use the callback
5189
+ this._onChangeCallback(formControlValue);
5190
+ // Check if need to update controls
5191
+ this.checkIfTouched();
5192
+ }
5193
+ // Force the day control to update its validity (same errors as formControl - see ngOnInit())
5194
+ this.textControl.updateValueAndValidity();
5167
5195
  this._writing = false;
5168
5196
  }
5169
5197
  waitKeyboardHide(waitKeyboardDelay) {
@@ -5180,21 +5208,6 @@ class MatDate {
5180
5208
  }
5181
5209
  });
5182
5210
  }
5183
- emitChange(value) {
5184
- // Get the model value
5185
- const dateStr = toDateISOString(value) || null;
5186
- if (this.formControl.value !== dateStr) {
5187
- // DEBUG
5188
- //console.debug('[mat-date] Emit new value: ' + dateStr);
5189
- // Apply to form control. => Will call writeValue()
5190
- // NOT NEED, because a formControl should NOT be used by multiple fields
5191
- //this.formControl.setValue(dateStr, {emitEvent: false})
5192
- // Changes comes from inside function: use the callback
5193
- this._onChangeCallback(dateStr);
5194
- // Check if need to update controls
5195
- this.checkIfTouched();
5196
- }
5197
- }
5198
5211
  updateTabIndex() {
5199
5212
  if (isNil(this._tabindex) || this._tabindex === -1)
5200
5213
  return; // skip
@@ -5207,7 +5220,7 @@ class MatDate {
5207
5220
  });
5208
5221
  }
5209
5222
  markAsTouched(opts) {
5210
- this.dayControl.markAsTouched(opts);
5223
+ this.textControl.markAsTouched(opts);
5211
5224
  this._onTouchedCallback();
5212
5225
  this.markForCheck();
5213
5226
  }
@@ -5221,16 +5234,16 @@ class MatDate {
5221
5234
  MatDate.decorators = [
5222
5235
  { type: Component, args: [{
5223
5236
  selector: 'mat-date-field',
5224
- template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\">\n <ng-container [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </ng-container>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"\n ></mat-datepicker>\n\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
5237
+ template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: datePattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"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\">\n <ng-container [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 </ng-container>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"\n ></mat-datepicker>\n\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
5225
5238
  providers: [
5226
- DEFAULT_VALUE_ACCESSOR$5,
5239
+ DEFAULT_VALUE_ACCESSOR,
5227
5240
  ],
5228
5241
  changeDetection: ChangeDetectionStrategy.OnPush,
5229
5242
  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%}"]
5230
5243
  },] }
5231
5244
  ];
5232
5245
  MatDate.ctorParameters = () => [
5233
- { type: DateAdapter },
5246
+ { type: MomentDateAdapter },
5234
5247
  { type: TranslateService },
5235
5248
  { type: FormBuilder },
5236
5249
  { type: ChangeDetectorRef },
@@ -5257,16 +5270,16 @@ MatDate.propDecorators = {
5257
5270
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5258
5271
  };
5259
5272
 
5260
- const DEFAULT_VALUE_ACCESSOR$4 = {
5273
+ const DEFAULT_VALUE_ACCESSOR$1 = {
5261
5274
  provide: NG_VALUE_ACCESSOR,
5262
5275
  useExisting: forwardRef(() => MatDateTime),
5263
5276
  multi: true
5264
5277
  };
5265
- const DAY_MASK$1 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5278
+ const DAY_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5266
5279
  const HOUR_REGEXP = /^[012][0-9][:][012345][0-9]$/;
5267
- const HOUR_MASK$1 = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5268
- const noop$5 = () => { };
5269
- const ɵ0$8 = noop$5;
5280
+ const HOUR_MASK = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5281
+ const noop$3 = () => { };
5282
+ const ɵ0$4 = noop$3;
5270
5283
  class MatDateTime {
5271
5284
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5272
5285
  this.dateAdapter = dateAdapter;
@@ -5275,14 +5288,14 @@ class MatDateTime {
5275
5288
  this.cd = cd;
5276
5289
  this.keyboard = keyboard;
5277
5290
  this.formGroupDir = formGroupDir;
5278
- this._onChangeCallback = noop$5;
5279
- this._onTouchedCallback = noop$5;
5291
+ this._onChangeCallback = noop$3;
5292
+ this._onTouchedCallback = noop$3;
5280
5293
  this._subscription = new Subscription();
5281
5294
  this._writing = true;
5282
5295
  this._disabling = false;
5283
5296
  this._readonly = false;
5284
- this.dayMask = DAY_MASK$1;
5285
- this.hourMask = HOUR_MASK$1;
5297
+ this.dayMask = DAY_MASK;
5298
+ this.hourMask = HOUR_MASK;
5286
5299
  this.floatLabel = 'auto';
5287
5300
  this.compact = false;
5288
5301
  this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
@@ -5596,14 +5609,14 @@ MatDateTime.decorators = [
5596
5609
  selector: 'mat-date-time-field',
5597
5610
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable + time -->\n<ng-template #writable >\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding no-wrap\" nowrap>\n\n <!-- day -->\n <ion-col class=\"day ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"></mat-datepicker>\n <div class=\"mat-form-field-subscript mat-form-field-subscript-wrapper\" >\n <!-- errors -->\n <ng-container [ngSwitch]=\"formControl.touched && formControl.errors|mapKeys|arrayFirst\">\n <mat-error *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</mat-error>\n </ng-container>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </div>\n\n </ion-col>\n\n <!-- hour -->\n <ion-col class=\"hour ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && (hourControl.invalid || formControl.invalid)\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n <input matInput #matInput type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"hourControl\"\n autocomplete=\"off\"\n min=\"0\" max=\"23\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.TIME_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keyup.arrowdown)=\"openTimePicker($event)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n <input matInput #matInput type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"hourControl\"\n (click)=\"openTimePickerIfMobile($event)\"\n readonly>\n\n <input matInput type=\"text\"\n [formControl]=\"hourControl\"\n hidden\n [ngxTimepicker]=\"timePicker\"\n [format]=\"24\">\n\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && !mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePicker($event)\" >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePickerIfMobile($event)\">\n <mat-icon>access_time</mat-icon>\n </button>\n\n <ngx-material-timepicker #timePicker [@.disabled]=\"true\"\n (timeSet)=\"onTimePickerChange($event)\"\n [ESC]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"false\"\n [disableAnimation]=\"true\">\n <!-- cancel button -->\n <ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n </ng-template>\n\n <!-- confirm button -->\n <ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ng-template>\n\n </ngx-material-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
5598
5611
  providers: [
5599
- DEFAULT_VALUE_ACCESSOR$4,
5612
+ DEFAULT_VALUE_ACCESSOR$1,
5600
5613
  ],
5601
5614
  changeDetection: ChangeDetectionStrategy.OnPush,
5602
5615
  styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field .datetime-md{padding:0!important}ion-row.no-wrap{flex-wrap:nowrap}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field input[type=text],ion-col.hour mat-form-field mat-label{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}"]
5603
5616
  },] }
5604
5617
  ];
5605
5618
  MatDateTime.ctorParameters = () => [
5606
- { type: DateAdapter },
5619
+ { type: MomentDateAdapter },
5607
5620
  { type: TranslateService },
5608
5621
  { type: FormBuilder },
5609
5622
  { type: ChangeDetectorRef },
@@ -5630,15 +5643,15 @@ MatDateTime.propDecorators = {
5630
5643
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5631
5644
  };
5632
5645
 
5633
- const DEFAULT_VALUE_ACCESSOR$3 = {
5646
+ const DEFAULT_VALUE_ACCESSOR$2 = {
5634
5647
  provide: NG_VALUE_ACCESSOR,
5635
5648
  useExisting: forwardRef(() => MatDateShort),
5636
5649
  multi: true
5637
5650
  };
5638
- const DAY_MASK = [/\d/, /\d/, /\d/, /\d/];
5651
+ const DAY_MASK$1 = [/\d/, /\d/, /\d/, /\d/];
5639
5652
  const noop$4 = () => {
5640
5653
  };
5641
- const ɵ0$7 = noop$4;
5654
+ const ɵ0$5 = noop$4;
5642
5655
  class MatDateShort {
5643
5656
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5644
5657
  this.dateAdapter = dateAdapter;
@@ -5651,7 +5664,7 @@ class MatDateShort {
5651
5664
  this._onTouchedCallback = noop$4;
5652
5665
  this.writing = true;
5653
5666
  this.disabling = false;
5654
- this.dayMask = DAY_MASK;
5667
+ this.dayMask = DAY_MASK$1;
5655
5668
  this.disabled = false;
5656
5669
  this.floatLabel = 'auto';
5657
5670
  this.readonly = false;
@@ -5896,7 +5909,7 @@ MatDateShort.decorators = [
5896
5909
  selector: 'mat-date-short-field',
5897
5910
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_YEAR_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker1)\"\n (keyup.escape)=\"preventEvent($event)\"\n (click)=\"matInput.select()\"\n [required]=\"required\"\n [tabindex]=\"tabindex\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker1)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final control -->\n <input matInput type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker1\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n (click)=\"openDatePicker($event, datePicker1)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"writeValue(null)\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('validDate')\" translate>ERROR.FIELD_NOT_VALID_DATE</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateIsAfter')\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateRange')\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMaxDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMinDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngIf=\"formControl.hasError('msg')\">{{formControl.errors.msg}}</mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <mat-datepicker #datePicker1\n startView=\"multi-year\"\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n (yearSelected)=\"closeDatePicker($event, datePicker1)\"\n [startAt]=\"startDate\"></mat-datepicker>\n\n <ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n </ng-template>\n\n <ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n </ng-template>\n\n</ng-template>\n",
5898
5911
  providers: [
5899
- DEFAULT_VALUE_ACCESSOR$3,
5912
+ DEFAULT_VALUE_ACCESSOR$2,
5900
5913
  ],
5901
5914
  changeDetection: ChangeDetectionStrategy.OnPush,
5902
5915
  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%}"]
@@ -5964,16 +5977,16 @@ SharedMatDateTimeModule.decorators = [
5964
5977
  },] }
5965
5978
  ];
5966
5979
 
5967
- const DEFAULT_VALUE_ACCESSOR$2 = {
5980
+ const DEFAULT_VALUE_ACCESSOR$3 = {
5968
5981
  provide: NG_VALUE_ACCESSOR,
5969
5982
  useExisting: forwardRef(() => MatDuration),
5970
5983
  multi: true
5971
5984
  };
5972
5985
  const HOUR_TIME_PATTERN = /[0-9]\d\d:[0-5]\d/;
5973
- const HOUR_MASK = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
5974
- const noop$3 = () => {
5986
+ const HOUR_MASK$1 = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
5987
+ const noop$5 = () => {
5975
5988
  };
5976
- const ɵ0$6 = noop$3;
5989
+ const ɵ0$6 = noop$5;
5977
5990
  class MatDuration {
5978
5991
  constructor(platform, dateAdapter, translate, formBuilder, cd, formGroupDir) {
5979
5992
  this.dateAdapter = dateAdapter;
@@ -5982,11 +5995,11 @@ class MatDuration {
5982
5995
  this.cd = cd;
5983
5996
  this.formGroupDir = formGroupDir;
5984
5997
  this._subscription = new Subscription();
5985
- this._onChangeCallback = noop$3;
5986
- this._onTouchedCallback = noop$3;
5998
+ this._onChangeCallback = noop$5;
5999
+ this._onTouchedCallback = noop$5;
5987
6000
  this.writing = true;
5988
6001
  this.disabling = false;
5989
- this.hourMask = HOUR_MASK;
6002
+ this.hourMask = HOUR_MASK$1;
5990
6003
  this.disabled = false;
5991
6004
  this.floatLabel = 'auto';
5992
6005
  this.readonly = false;
@@ -6166,7 +6179,7 @@ MatDuration.decorators = [
6166
6179
  selector: 'mat-duration-field',
6167
6180
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{ formControl.value|duration }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"formControl.disabled\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput type=\"text\"\n autocomplete=\"off\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.DURATION_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keydown.tab)=\"moveCaretToSeparator($event, true)\"\n (keydown.shift.tab)=\"moveCaretToSeparator($event, false)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n\n <!-- errors -->\n <mat-error *ngIf=\"!formControl.hasError('required') && textControl.hasError('pattern')\" translate>ERROR.FIELD_NOT_VALID_PATTERN</mat-error>\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{(compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate:formControl.errors.min }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{(compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate:formControl.errors.max }}</mat-error>\n\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n</ng-template>\n\n",
6168
6181
  providers: [
6169
- DEFAULT_VALUE_ACCESSOR$2,
6182
+ DEFAULT_VALUE_ACCESSOR$3,
6170
6183
  ],
6171
6184
  changeDetection: ChangeDetectionStrategy.OnPush,
6172
6185
  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%}"]
@@ -6223,22 +6236,22 @@ SharedMatDurationModule.decorators = [
6223
6236
  },] }
6224
6237
  ];
6225
6238
 
6226
- const DEFAULT_VALUE_ACCESSOR$1 = {
6239
+ const DEFAULT_VALUE_ACCESSOR$4 = {
6227
6240
  provide: NG_VALUE_ACCESSOR,
6228
6241
  useExisting: forwardRef(() => MatBooleanField),
6229
6242
  multi: true
6230
6243
  };
6231
- const noop$2 = () => {
6244
+ const noop$6 = () => {
6232
6245
  };
6233
- const ɵ0$5 = noop$2;
6246
+ const ɵ0$7 = noop$6;
6234
6247
  class MatBooleanField {
6235
6248
  constructor(translate, formBuilder, cd, formGroupDir) {
6236
6249
  this.translate = translate;
6237
6250
  this.formBuilder = formBuilder;
6238
6251
  this.cd = cd;
6239
6252
  this.formGroupDir = formGroupDir;
6240
- this._onChangeCallback = noop$2;
6241
- this._onTouchedCallback = noop$2;
6253
+ this._onChangeCallback = noop$6;
6254
+ this._onTouchedCallback = noop$6;
6242
6255
  this._writing = false;
6243
6256
  this.showRadio = false;
6244
6257
  this.disabled = false;
@@ -6401,7 +6414,7 @@ MatBooleanField.decorators = [
6401
6414
  selector: 'mat-boolean-field',
6402
6415
  template: "<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{(formControl.value == null && 'COMMON.EMPTY_OPTION' || (formControl.value === true && yesLabel) || noLabel) | translate }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<ng-template #writable>\n <ng-container [ngSwitch]=\"style\">\n\n <!-- Radio -->\n <mat-form-field *ngSwitchCase=\"'radio'\"\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-radio {{classList}}\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n <span [hidden]=\"showRadio\">({{yesLabel|translate}}/{{'COMMON.NO'|translate}})</span>\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #fakeInput type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <!-- radio button -->\n <mat-radio-group [hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\">\n <mat-radio-button #yesButton [value]=\"true\">\n <span>{{yesLabel|translate}}</span>\n </mat-radio-button>&nbsp;\n <mat-radio-button #noButton [value]=\"false\">\n <span>{{noLabel|translate}}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Checkbox -->\n <mat-form-field *ngSwitchCase=\"'checkbox'\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{classList}}\">\n <mat-label *ngIf=\"placeholder && !showRadio\">\n {{placeholder}}\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #matInput\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <ion-label>&nbsp;</ion-label>\n\n <!-- checkbox, when compact -->\n <mat-checkbox #checkboxButton\n [formControl]=\"formControl\"\n (change)=\"onCheckboxValueChanged($event)\"\n [indeterminate]=\"value===undefined\"\n [hidden]=\"!showRadio\"\n [tabindex]=\"tabindex\">\n </mat-checkbox>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Buttons -->\n <mat-form-field *ngSwitchCase=\"'button'\"\n [floatLabel]=\"floatLabel === 'never' ? 'never' : 'always'\"\n class=\"mat-boolean-field mat-boolean-field-button {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput type=\"text\" hidden\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\">\n <div class=\"mat-form-field-buttons\"\n [style.--buttons-col-count]=\"buttonsColCount\"\n *ngIf=\"!formControl.disabled; else disabledLabel\">\n <!-- yes -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === true) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && yesIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{yesLabel|translate}}\n </ion-button>\n\n <!-- No button -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex !== undefined ? (_tabindex + 1) : undefined\"\n (click)=\"writeValue(false, $event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === false) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && noIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{noLabel|translate}}\n </ion-button>\n </div>\n <ng-template #disabledLabel>\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ng-template>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n </ng-container>\n\n</ng-template>\n\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
6403
6416
  providers: [
6404
- DEFAULT_VALUE_ACCESSOR$1
6417
+ DEFAULT_VALUE_ACCESSOR$4
6405
6418
  ],
6406
6419
  changeDetection: ChangeDetectionStrategy.OnPush,
6407
6420
  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}"]
@@ -6647,7 +6660,7 @@ class MatNumpadDomService {
6647
6660
  this.appRef.detachView(this.componentRef.hostView);
6648
6661
  }
6649
6662
  }
6650
- 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" });
6663
+ MatNumpadDomService.ɵprov = ɵɵdefineInjectable({ factory: function MatNumpadDomService_Factory() { return new MatNumpadDomService(ɵɵinject(ComponentFactoryResolver), ɵɵinject(ApplicationRef), ɵɵinject(INJECTOR), ɵɵinject(DOCUMENT, 8)); }, token: MatNumpadDomService, providedIn: "root" });
6651
6664
  MatNumpadDomService.decorators = [
6652
6665
  { type: Injectable, args: [{
6653
6666
  providedIn: 'root'
@@ -7011,7 +7024,7 @@ SharedMatNumpadModule.decorators = [
7011
7024
  },] }
7012
7025
  ];
7013
7026
 
7014
- const DEFAULT_VALUE_ACCESSOR = {
7027
+ const DEFAULT_VALUE_ACCESSOR$5 = {
7015
7028
  provide: NG_VALUE_ACCESSOR,
7016
7029
  useExisting: forwardRef(() => MatSwipeField),
7017
7030
  multi: true
@@ -7274,7 +7287,7 @@ MatSwipeField.decorators = [
7274
7287
  { type: Component, args: [{
7275
7288
  selector: 'mat-swipe-field',
7276
7289
  template: "<mat-form-field [floatLabel]=\"showSlides && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n [class]=\"classList\"\n [class.mat-form-field-disabled]=\"disabled\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n </mat-label>\n <input matInput #fakeInput type=\"text\"\n [formControl]=\"formControl\"\n [readonly]=\"true\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showSlides\"\n [tabindex]=\"tabindex\">\n\n <div class=\"slides-container\" [class.hidden]=\"!showSlides\">\n <ion-slides #slides\n [options]=\"slidesOptions\"\n (ionSlidesDidLoad)=\"slidesLoaded()\"\n (ionSlideReachStart)=\"reachStart(true)\"\n (ionSlideReachEnd)=\"reachEnd(true)\"\n (ionSlideNextEnd)=\"reachStart(false)\"\n (ionSlidePrevEnd)=\"reachEnd(false)\"\n (ionSlideDidChange)=\"slideChanged()\"\n >\n <ion-slide *ngFor=\"let item of $items | async\">\n <ion-label>{{ displayWith(item) }}</ion-label>\n </ion-slide>\n\n </ion-slides>\n </div>\n\n <button #prevButton\n mat-icon-button\n type=\"button\"\n class=\"button-prev\"\n [hidden]=\"!showSlides\"\n [disabled]=\"previousDisabled\"\n (click)=\"previous()\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button #nextButton\n mat-icon-button\n type=\"button\"\n class=\"button-next\"\n [hidden]=\"!showSlides\"\n [disabled]=\"nextDisabled\"\n (click)=\"next()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n\n</mat-form-field>\n",
7277
- providers: [DEFAULT_VALUE_ACCESSOR],
7290
+ providers: [DEFAULT_VALUE_ACCESSOR$5],
7278
7291
  changeDetection: ChangeDetectionStrategy.OnPush,
7279
7292
  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}"]
7280
7293
  },] }
@@ -7332,14 +7345,14 @@ SharedMatSwipeModule.decorators = [
7332
7345
  },] }
7333
7346
  ];
7334
7347
 
7335
- const noop$1 = () => { };
7336
- const ɵ0$4 = noop$1;
7348
+ const noop$7 = () => { };
7349
+ const ɵ0$8 = noop$7;
7337
7350
  class MatChipsField {
7338
7351
  constructor(cd, formGroupDir) {
7339
7352
  this.cd = cd;
7340
7353
  this.formGroupDir = formGroupDir;
7341
- this._onChangeCallback = noop$1;
7342
- this._onTouchedCallback = noop$1;
7354
+ this._onChangeCallback = noop$7;
7355
+ this._onTouchedCallback = noop$7;
7343
7356
  this.logPrefix = '[mat-chips] ';
7344
7357
  this.formControlName = null;
7345
7358
  this.required = false;
@@ -8211,7 +8224,7 @@ class ProgressBarService {
8211
8224
  }
8212
8225
  }
8213
8226
  }
8214
- ProgressBarService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8227
+ ProgressBarService.ɵprov = ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8215
8228
  ProgressBarService.decorators = [
8216
8229
  { type: Injectable, args: [{ providedIn: 'root' },] }
8217
8230
  ];
@@ -8255,7 +8268,7 @@ class AppGestureConfig extends HammerGestureConfig {
8255
8268
  return mc;
8256
8269
  }
8257
8270
  }
8258
- AppGestureConfig.ɵprov = i0.ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8271
+ AppGestureConfig.ɵprov = ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8259
8272
  AppGestureConfig.decorators = [
8260
8273
  { type: Injectable, args: [{ providedIn: 'root' },] }
8261
8274
  ];
@@ -8480,7 +8493,7 @@ class MatPaginatorI18n extends MatPaginatorIntl {
8480
8493
  this.previousPageLabel = this.translate.instant('COMMON.PAGINATOR.PREVIOUS_PAGE');
8481
8494
  }
8482
8495
  }
8483
- MatPaginatorI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8496
+ MatPaginatorI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(ɵɵinject(TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8484
8497
  MatPaginatorI18n.decorators = [
8485
8498
  { type: Injectable, args: [{ providedIn: 'root' },] }
8486
8499
  ];
@@ -8570,17 +8583,17 @@ function getColorContrast(color, bw) {
8570
8583
  return rgbArrayToHex(rgb.map(v => 255 - v));
8571
8584
  }
8572
8585
 
8573
- const noop = () => {
8586
+ const noop$8 = () => {
8574
8587
  };
8575
- const ɵ0$3 = noop;
8588
+ const ɵ0$9 = noop$8;
8576
8589
  class AppFormField {
8577
8590
  constructor(translate, cd, injector, formGroupDir) {
8578
8591
  this.translate = translate;
8579
8592
  this.cd = cd;
8580
8593
  this.injector = injector;
8581
8594
  this.formGroupDir = formGroupDir;
8582
- this._onChangeCallback = noop;
8583
- this._onTouchedCallback = noop;
8595
+ this._onChangeCallback = noop$8;
8596
+ this._onTouchedCallback = noop$8;
8584
8597
  this.readonly = false;
8585
8598
  this.compact = false;
8586
8599
  this.floatLabel = 'auto';
@@ -9016,14 +9029,14 @@ class AudioProvider extends StartableService {
9016
9029
  });
9017
9030
  }
9018
9031
  }
9019
- 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" });
9032
+ 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" });
9020
9033
  AudioProvider.decorators = [
9021
9034
  { type: Injectable, args: [{ providedIn: 'root' },] }
9022
9035
  ];
9023
9036
  AudioProvider.ctorParameters = () => [
9024
9037
  { type: Platform },
9025
- { type: NativeAudio, decorators: [{ type: Optional }] },
9026
- { type: Vibration, decorators: [{ type: Optional }] },
9038
+ { type: NativeAudio$1, decorators: [{ type: Optional }] },
9039
+ { type: Vibration$1, decorators: [{ type: Optional }] },
9027
9040
  { type: AudioManagement, decorators: [{ type: Optional }] }
9028
9041
  ];
9029
9042
 
@@ -9108,7 +9121,7 @@ class Hotkeys {
9108
9121
  });
9109
9122
  }
9110
9123
  }
9111
- 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" });
9124
+ Hotkeys.ɵprov = ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(ɵɵinject(EventManager), ɵɵinject(MatDialog), ɵɵinject(DOCUMENT), ɵɵinject(ModalController), ɵɵinject(PopoverController)); }, token: Hotkeys, providedIn: "root" });
9112
9125
  Hotkeys.decorators = [
9113
9126
  { type: Injectable, args: [{
9114
9127
  providedIn: 'root'
@@ -9283,7 +9296,7 @@ class Base64ImageReader {
9283
9296
  }
9284
9297
  }
9285
9298
 
9286
- const uuidv4$1 = uuidv4Imported;
9299
+ const uuidv4 = uuidv4Imported;
9287
9300
  class FileService {
9288
9301
  constructor(platform,
9289
9302
  //private transfer: FileTransfer,
@@ -9320,7 +9333,7 @@ class FileService {
9320
9333
  const lastSlashIndex = source.lastIndexOf('/');
9321
9334
  if (lastSlashIndex === -1)
9322
9335
  throw new Error('Invalid URL: ' + source);
9323
- const fileName = lastSlashIndex < (source.length - 1) && source.substring(lastSlashIndex + 1) || uuidv4$1();
9336
+ const fileName = lastSlashIndex < (source.length - 1) && source.substring(lastSlashIndex + 1) || uuidv4();
9324
9337
  // Download into the file system
9325
9338
  if (responseType === 'file' && this.canUseFileSystem) {
9326
9339
  console.warn(`WARN: [file] Fetching image {${source}} in local file...`);
@@ -9376,7 +9389,7 @@ class FileService {
9376
9389
  this._started = true;
9377
9390
  }
9378
9391
  }
9379
- 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" });
9392
+ FileService.ɵprov = ɵɵdefineInjectable({ factory: function FileService_Factory() { return new FileService(ɵɵinject(Platform), ɵɵinject(HttpClient), ɵɵinject(ENVIRONMENT)); }, token: FileService, providedIn: "root" });
9380
9393
  FileService.decorators = [
9381
9394
  { type: Injectable, args: [{
9382
9395
  providedIn: 'root',
@@ -9542,7 +9555,7 @@ class Base58 {
9542
9555
  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
9543
9556
 
9544
9557
  const scrypt = require('scrypt-async');
9545
- const sha256$1 = require('hash.js/lib/hash/sha/256');
9558
+ const sha256 = require('hash.js/lib/hash/sha/256');
9546
9559
  const sha512 = require('hash.js/lib/hash/sha/512');
9547
9560
  const nacl = {
9548
9561
  sign,
@@ -9646,7 +9659,7 @@ class CryptoService {
9646
9659
  * Hash (using SHA256) a message
9647
9660
  */
9648
9661
  sha256(message) {
9649
- return sha256$1().update(message).digest('hex');
9662
+ return sha256().update(message).digest('hex');
9650
9663
  }
9651
9664
  /**
9652
9665
  * Hash (using SHA512) a message
@@ -9659,7 +9672,7 @@ class CryptoService {
9659
9672
  return nacl.util.encodeBase64(m);
9660
9673
  }
9661
9674
  }
9662
- CryptoService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
9675
+ CryptoService.ɵprov = ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
9663
9676
  CryptoService.decorators = [
9664
9677
  { type: Injectable, args: [{ providedIn: 'root' },] }
9665
9678
  ];
@@ -10419,7 +10432,7 @@ SelectPeerModal.propDecorators = {
10419
10432
  onRefresh: [{ type: Input }]
10420
10433
  };
10421
10434
 
10422
- const moment$4 = momentImported;
10435
+ const moment$3 = momentImported;
10423
10436
  const SETTINGS_STORAGE_KEY = 'settings';
10424
10437
  const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
10425
10438
  // fixme: this constant points to static environment
@@ -10662,11 +10675,11 @@ class LocalSettingsService extends StartableService {
10662
10675
  if (!feature) {
10663
10676
  feature = {
10664
10677
  name: featureName.toLowerCase(),
10665
- lastSyncDate: moment$4().toISOString()
10678
+ lastSyncDate: moment$3().toISOString()
10666
10679
  };
10667
10680
  }
10668
10681
  else {
10669
- feature.lastSyncDate = moment$4().toISOString();
10682
+ feature.lastSyncDate = moment$3().toISOString();
10670
10683
  }
10671
10684
  this.saveOfflineFeature(feature);
10672
10685
  }
@@ -10827,7 +10840,7 @@ class LocalSettingsService extends StartableService {
10827
10840
  if (!page || !page.title || !page.path)
10828
10841
  throw Error('Missing required argument \'page\', \'page.path\' or \'page.title\'');
10829
10842
  // Set time
10830
- page.time = page.time || moment$4();
10843
+ page.time = page.time || moment$3();
10831
10844
  // Clean the title (remove <small> tags)
10832
10845
  if (!opts || opts.removeTitleSmallTag !== false) {
10833
10846
  const tagIndex = page.title.indexOf('</small>');
@@ -10843,18 +10856,18 @@ class LocalSettingsService extends StartableService {
10843
10856
  return page;
10844
10857
  }
10845
10858
  }
10846
- 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" });
10859
+ 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" });
10847
10860
  LocalSettingsService.decorators = [
10848
10861
  { type: Injectable, args: [{
10849
- providedIn: 'root',
10850
- deps: [APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS]
10862
+ providedIn: 'root'
10863
+ //deps: [APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS]
10851
10864
  },] }
10852
10865
  ];
10853
10866
  LocalSettingsService.ctorParameters = () => [
10854
10867
  { type: TranslateService },
10855
10868
  { type: Platform },
10856
10869
  { type: Storage },
10857
- { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
10870
+ { type: Environment, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
10858
10871
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_LOCAL_SETTINGS,] }] },
10859
10872
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_LOCAL_SETTINGS_OPTIONS,] }] }
10860
10873
  ];
@@ -11560,7 +11573,7 @@ class NetworkService extends StartableService {
11560
11573
  });
11561
11574
  }
11562
11575
  }
11563
- 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" });
11576
+ 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" });
11564
11577
  NetworkService.decorators = [
11565
11578
  { type: Injectable, args: [{ providedIn: 'root' },] }
11566
11579
  ];
@@ -11571,16 +11584,16 @@ NetworkService.ctorParameters = () => [
11571
11584
  { type: CryptoService },
11572
11585
  { type: Storage },
11573
11586
  { type: LocalSettingsService },
11574
- { type: CacheService },
11587
+ { type: CacheService$1 },
11575
11588
  { type: HttpClient },
11576
11589
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
11577
- { type: Network, decorators: [{ type: Optional }] },
11578
- { type: SplashScreen, decorators: [{ type: Optional }] },
11590
+ { type: Network$1, decorators: [{ type: Optional }] },
11591
+ { type: SplashScreen$1, decorators: [{ type: Optional }] },
11579
11592
  { type: TranslateService, decorators: [{ type: Optional }] },
11580
11593
  { type: ToastController, decorators: [{ type: Optional }] }
11581
11594
  ];
11582
11595
 
11583
- const ErrorCodes$2 = {
11596
+ const ErrorCodes = {
11584
11597
  UNKNOWN_ERROR: 0,
11585
11598
  LOAD_ACCOUNT_ERROR: 1,
11586
11599
  BAD_PASSWORD: 2,
@@ -11932,7 +11945,7 @@ class EntityStore {
11932
11945
  }
11933
11946
  catch (err) {
11934
11947
  console.error(err);
11935
- throw { code: ErrorCodes$2.ENTITY_STORAGE_MIGRATION_FAILED, message: 'ERROR.ENTITY_STORAGE_MIGRATION_FAILED', details: err };
11948
+ throw { code: ErrorCodes.ENTITY_STORAGE_MIGRATION_FAILED, message: 'ERROR.ENTITY_STORAGE_MIGRATION_FAILED', details: err };
11936
11949
  }
11937
11950
  }
11938
11951
  // Emit update event
@@ -12506,7 +12519,7 @@ class EntitiesStorage extends StartableService {
12506
12519
  }
12507
12520
  EntitiesStorage.TRASH_PREFIX = 'Trash#';
12508
12521
  EntitiesStorage.REMOTE_PREFIX = 'Remote#';
12509
- 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" });
12522
+ 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" });
12510
12523
  EntitiesStorage.decorators = [
12511
12524
  { type: Injectable, args: [{ providedIn: 'root' },] }
12512
12525
  ];
@@ -12643,10 +12656,10 @@ function referentialToString(obj, properties) {
12643
12656
  function referentialsToString(values, properties, separator) {
12644
12657
  return (values || []).map(v => referentialToString(v, properties)).join(separator || ', ');
12645
12658
  }
12646
- const ɵ0$2 = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12659
+ const ɵ0$a = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12647
12660
  const StatusList = Object.freeze([
12648
12661
  {
12649
- id: ɵ0$2,
12662
+ id: ɵ0$a,
12650
12663
  icon: 'checkmark',
12651
12664
  label: 'REFERENTIAL.STATUS_ENUM.ENABLE'
12652
12665
  },
@@ -12921,7 +12934,7 @@ function accountToString(data) {
12921
12934
  (data.lastName || '')) || '';
12922
12935
  }
12923
12936
 
12924
- const uuidv4 = uuidv4Imported;
12937
+ const uuidv4$1 = uuidv4Imported;
12925
12938
  const _global = typeof global !== 'undefined' ? global : (typeof window !== 'undefined' ? window : {});
12926
12939
  const NativeWebSocket = _global.WebSocket || _global.MozWebSocket;
12927
12940
  /**
@@ -12965,7 +12978,7 @@ function createTrackerLink(opts) {
12965
12978
  // Skip if not tracked
12966
12979
  if (!context || !context.tracked)
12967
12980
  return forward(operation);
12968
- const id = context.serializationKey || uuidv4();
12981
+ const id = context.serializationKey || uuidv4$1();
12969
12982
  console.debug(`[apollo-tracker-link] Watching tracked query {${operation.operationName}#${id}}`);
12970
12983
  // Clean context, before calling JSON.stringify (remove unused attributes)
12971
12984
  const cleanContext = Object.assign(Object.assign({}, context), { optimisticResponse: null, cache: null });
@@ -13628,7 +13641,7 @@ class GraphqlService extends StartableService {
13628
13641
  (err.networkError && ((err.networkError.error && this.toAppError(err.networkError.error))
13629
13642
  || this.toAppError(err.networkError)
13630
13643
  || (err.networkError.error && this.createAppErrorByCode(err.networkError.error.status))
13631
- || this.createAppErrorByCode(ErrorCodes$2.UNKNOWN_NETWORK_ERROR)))
13644
+ || this.createAppErrorByCode(ErrorCodes.UNKNOWN_NETWORK_ERROR)))
13632
13645
  // If graphQL: try to convert the first error found
13633
13646
  || (err.graphQLErrors && err.graphQLErrors.length && this.toAppError(err.graphQLErrors[0]))
13634
13647
  || this.toAppError(err)
@@ -13636,7 +13649,7 @@ class GraphqlService extends StartableService {
13636
13649
  || (err.graphQLErrors && err.graphQLErrors[0])
13637
13650
  || err;
13638
13651
  console.error('[graphql] ' + (error && error.message || error), error.stack || '');
13639
- if (error && error.code === ErrorCodes$2.UNKNOWN_NETWORK_ERROR && err.networkError && err.networkError.message) {
13652
+ if (error && error.code === ErrorCodes.UNKNOWN_NETWORK_ERROR && err.networkError && err.networkError.message) {
13640
13653
  console.error('[graphql] original error: ' + err.networkError.message);
13641
13654
  this.onNetworkError.next(error);
13642
13655
  }
@@ -13672,7 +13685,7 @@ class GraphqlService extends StartableService {
13672
13685
  return 'ERROR.UNAUTHORIZED';
13673
13686
  case ServerErrorCodes.FORBIDDEN:
13674
13687
  return 'ERROR.FORBIDDEN';
13675
- case ErrorCodes$2.UNKNOWN_NETWORK_ERROR:
13688
+ case ErrorCodes.UNKNOWN_NETWORK_ERROR:
13676
13689
  return 'ERROR.UNKNOWN_NETWORK_ERROR';
13677
13690
  case ServerErrorCodes.BAD_UPDATE_DATE:
13678
13691
  return 'ERROR.BAD_UPDATE_DATE';
@@ -13703,7 +13716,7 @@ class GraphqlService extends StartableService {
13703
13716
  return undefined;
13704
13717
  }
13705
13718
  }
13706
- 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" });
13719
+ 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" });
13707
13720
  GraphqlService.decorators = [
13708
13721
  { type: Injectable, args: [{
13709
13722
  providedIn: 'root'
@@ -13720,7 +13733,7 @@ GraphqlService.ctorParameters = () => [
13720
13733
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_GRAPHQL_TYPE_POLICIES,] }] }
13721
13734
  ];
13722
13735
 
13723
- const sha256 = require('hash.js/lib/hash/sha/256');
13736
+ const sha256$1 = require('hash.js/lib/hash/sha/256');
13724
13737
  class BaseGraphqlServiceOptions {
13725
13738
  }
13726
13739
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
@@ -13871,8 +13884,8 @@ class BaseGraphqlService extends StartableService {
13871
13884
  }
13872
13885
  /* -- protected methods -- */
13873
13886
  computeMutableWatchQueryId(opts) {
13874
- const queryName = opts.queryName || sha256().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
13875
- const variablesKey = opts.variables && sha256().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
13887
+ const queryName = opts.queryName || sha256$1().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
13888
+ const variablesKey = opts.variables && sha256$1().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
13876
13889
  return [queryName, opts.arrayFieldName, variablesKey].join('|');
13877
13890
  }
13878
13891
  findMutableWatchQueries(opts) {
@@ -13942,7 +13955,7 @@ const DEFAULT_AVATAR_IMAGE = 'assets/img/person.png';
13942
13955
  /* ------------------------------------
13943
13956
  * GraphQL queries
13944
13957
  * ------------------------------------*/
13945
- const Fragments$1 = {
13958
+ const Fragments = {
13946
13959
  account: gql `
13947
13960
  fragment AccountFragment on AccountVO {
13948
13961
  id
@@ -13977,14 +13990,14 @@ const Fragments$1 = {
13977
13990
  }`
13978
13991
  };
13979
13992
  // Load account query
13980
- const LoadQuery$1 = gql `
13993
+ const LoadQuery = gql `
13981
13994
  query Account {
13982
13995
  data: account {
13983
13996
  ...AccountFragment
13984
13997
  }
13985
13998
  }
13986
- ${Fragments$1.account}
13987
- ${Fragments$1.settings}
13999
+ ${Fragments.account}
14000
+ ${Fragments.settings}
13988
14001
  `;
13989
14002
  // Check email query
13990
14003
  const IsEmailExistsQuery = gql `
@@ -13999,21 +14012,21 @@ const AccountMutations = {
13999
14012
  ...AccountFragment
14000
14013
  }
14001
14014
  }
14002
- ${Fragments$1.account}
14003
- ${Fragments$1.settings}`,
14015
+ ${Fragments.account}
14016
+ ${Fragments.settings}`,
14004
14017
  create: gql `mutation CreateAccount($data:AccountVOInput){
14005
14018
  data: createAccount(account: $data){
14006
14019
  ...AccountFragment
14007
14020
  }
14008
14021
  }
14009
- ${Fragments$1.account}
14010
- ${Fragments$1.settings}`,
14022
+ ${Fragments.account}
14023
+ ${Fragments.settings}`,
14011
14024
  saveSettings: gql `mutation SaveSettings($data:UserSettingsVOInput){
14012
14025
  data: saveSettings(settings: $data){
14013
14026
  ...UserSettingsFragment
14014
14027
  }
14015
14028
  }
14016
- ${Fragments$1.settings}`
14029
+ ${Fragments.settings}`
14017
14030
  };
14018
14031
  // Sent confirmation email
14019
14032
  const SendConfirmEmailMutation = gql `
@@ -14328,7 +14341,7 @@ class AccountService extends BaseGraphqlService {
14328
14341
  catch (error) {
14329
14342
  console.error(error);
14330
14343
  this.resetData();
14331
- throw { code: ErrorCodes$2.UNKNOWN_ERROR, message: 'ERROR.SCRYPT_ERROR' };
14344
+ throw { code: ErrorCodes.UNKNOWN_ERROR, message: 'ERROR.SCRYPT_ERROR' };
14332
14345
  }
14333
14346
  // Store pubkey+keypair
14334
14347
  this._cache.pubkey = Base58.encode(keypair.publicKey);
@@ -14362,7 +14375,7 @@ class AccountService extends BaseGraphqlService {
14362
14375
  }
14363
14376
  catch (err) {
14364
14377
  // If account not found, check if email is valid
14365
- if (err && +(err.code) === ErrorCodes$2.LOAD_ACCOUNT_ERROR) {
14378
+ if (err && +(err.code) === ErrorCodes.LOAD_ACCOUNT_ERROR) {
14366
14379
  // Check email exists
14367
14380
  if (data.username.indexOf('@') !== -1) {
14368
14381
  let isEmailExists;
@@ -14374,11 +14387,11 @@ class AccountService extends BaseGraphqlService {
14374
14387
  }
14375
14388
  // Email not exists (no account)
14376
14389
  if (!isEmailExists) {
14377
- throw { code: ErrorCodes$2.UNKNOWN_ACCOUNT_EMAIL, message: 'ERROR.UNKNOWN_ACCOUNT_EMAIL' };
14390
+ throw { code: ErrorCodes.UNKNOWN_ACCOUNT_EMAIL, message: 'ERROR.UNKNOWN_ACCOUNT_EMAIL' };
14378
14391
  }
14379
14392
  }
14380
14393
  // Email exists, so error = 'bad password'
14381
- throw { code: ErrorCodes$2.BAD_PASSWORD, message: 'ERROR.BAD_PASSWORD' };
14394
+ throw { code: ErrorCodes.BAD_PASSWORD, message: 'ERROR.BAD_PASSWORD' };
14382
14395
  }
14383
14396
  throw err; // resend the first error
14384
14397
  }
@@ -14524,8 +14537,8 @@ class AccountService extends BaseGraphqlService {
14524
14537
  // Load remotely
14525
14538
  else {
14526
14539
  const { data } = yield this.graphql.query({
14527
- query: LoadQuery$1,
14528
- error: { code: ErrorCodes$2.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
14540
+ query: LoadQuery,
14541
+ error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
14529
14542
  fetchPolicy: opts && opts.fetchPolicy || 'no-cache' || undefined
14530
14543
  });
14531
14544
  json = data;
@@ -14552,7 +14565,7 @@ class AccountService extends BaseGraphqlService {
14552
14565
  return __awaiter(this, void 0, void 0, function* () {
14553
14566
  const isEmailExists = yield this.isEmailExists(email);
14554
14567
  if (isEmailExists) {
14555
- throw { code: ErrorCodes$2.EMAIL_ALREADY_REGISTERED, message: 'ERROR.EMAIL_ALREADY_REGISTERED' };
14568
+ throw { code: ErrorCodes.EMAIL_ALREADY_REGISTERED, message: 'ERROR.EMAIL_ALREADY_REGISTERED' };
14556
14569
  }
14557
14570
  });
14558
14571
  }
@@ -14588,7 +14601,7 @@ class AccountService extends BaseGraphqlService {
14588
14601
  locale
14589
14602
  },
14590
14603
  error: {
14591
- code: ErrorCodes$2.SENT_CONFIRMATION_EMAIL_FAILED,
14604
+ code: ErrorCodes.SENT_CONFIRMATION_EMAIL_FAILED,
14592
14605
  message: 'ERROR.SENT_ACCOUNT_CONFIRMATION_EMAIL_FAILED'
14593
14606
  }
14594
14607
  });
@@ -14604,7 +14617,7 @@ class AccountService extends BaseGraphqlService {
14604
14617
  code
14605
14618
  },
14606
14619
  error: {
14607
- code: ErrorCodes$2.CONFIRM_EMAIL_FAILED,
14620
+ code: ErrorCodes.CONFIRM_EMAIL_FAILED,
14608
14621
  message: 'ERROR.CONFIRM_ACCOUNT_EMAIL_FAILED'
14609
14622
  }
14610
14623
  });
@@ -14683,7 +14696,7 @@ class AccountService extends BaseGraphqlService {
14683
14696
  throw error;
14684
14697
  console.error(error);
14685
14698
  throw {
14686
- code: ErrorCodes$2.LOAD_ACCOUNT_ERROR,
14699
+ code: ErrorCodes.LOAD_ACCOUNT_ERROR,
14687
14700
  message: 'ERROR.LOAD_ACCOUNT_ERROR'
14688
14701
  };
14689
14702
  }
@@ -14853,7 +14866,7 @@ class AccountService extends BaseGraphqlService {
14853
14866
  if (!isNew) {
14854
14867
  const existingAccount = yield this.load({ fetchPolicy: 'network-only' });
14855
14868
  if (!existingAccount || !existingAccount.updateDate) {
14856
- throw { code: ErrorCodes$2.ACCOUNT_NOT_EXISTS, message: 'ERROR.ACCOUNT_NOT_EXISTS' };
14869
+ throw { code: ErrorCodes.ACCOUNT_NOT_EXISTS, message: 'ERROR.ACCOUNT_NOT_EXISTS' };
14857
14870
  }
14858
14871
  this.copyIdAndUpdateDate(existingAccount, account);
14859
14872
  }
@@ -14865,7 +14878,7 @@ class AccountService extends BaseGraphqlService {
14865
14878
  mutation: isNew ? AccountMutations.create : AccountMutations.save,
14866
14879
  variables: { data: json },
14867
14880
  error: {
14868
- code: ErrorCodes$2.SAVE_ACCOUNT_ERROR,
14881
+ code: ErrorCodes.SAVE_ACCOUNT_ERROR,
14869
14882
  message: 'ERROR.SAVE_ACCOUNT_ERROR'
14870
14883
  }
14871
14884
  });
@@ -14892,7 +14905,7 @@ class AccountService extends BaseGraphqlService {
14892
14905
  mutation: AccountMutations.saveSettings,
14893
14906
  variables: { data: json },
14894
14907
  error: {
14895
- code: ErrorCodes$2.SAVE_SETTINGS_ERROR,
14908
+ code: ErrorCodes.SAVE_SETTINGS_ERROR,
14896
14909
  message: 'ERROR.SAVE_SETTINGS_ERROR'
14897
14910
  }
14898
14911
  });
@@ -14914,7 +14927,7 @@ class AccountService extends BaseGraphqlService {
14914
14927
  if (counter > 4) {
14915
14928
  if (this._debug)
14916
14929
  console.debug(`[account] Failed to authentication on pod (after ${counter} attempts)`);
14917
- throw { code: ErrorCodes$2.AUTH_SERVER_ERROR, message: 'ERROR.AUTH_SERVER_ERROR' };
14930
+ throw { code: ErrorCodes.AUTH_SERVER_ERROR, message: 'ERROR.AUTH_SERVER_ERROR' };
14918
14931
  }
14919
14932
  // Check if valid
14920
14933
  if (token) {
@@ -14924,7 +14937,7 @@ class AccountService extends BaseGraphqlService {
14924
14937
  token
14925
14938
  },
14926
14939
  error: {
14927
- code: ErrorCodes$2.UNAUTHORIZED,
14940
+ code: ErrorCodes.UNAUTHORIZED,
14928
14941
  message: 'ERROR.UNAUTHORIZED'
14929
14942
  },
14930
14943
  fetchPolicy: 'no-cache'
@@ -14940,7 +14953,7 @@ class AccountService extends BaseGraphqlService {
14940
14953
  }
14941
14954
  // Generate a new token
14942
14955
  const challengeError = {
14943
- code: ErrorCodes$2.AUTH_CHALLENGE_ERROR,
14956
+ code: ErrorCodes.AUTH_CHALLENGE_ERROR,
14944
14957
  message: 'ERROR.AUTH_CHALLENGE_ERROR'
14945
14958
  };
14946
14959
  const data = yield this.graphql.query({
@@ -15018,7 +15031,7 @@ class AccountService extends BaseGraphqlService {
15018
15031
  query: AccountSubscriptions.listenChanges,
15019
15032
  variables,
15020
15033
  error: {
15021
- code: ErrorCodes$2.SUBSCRIBE_ACCOUNT_ERROR,
15034
+ code: ErrorCodes.SUBSCRIBE_ACCOUNT_ERROR,
15022
15035
  message: 'ERROR.ACCOUNT.SUBSCRIBE_ERROR'
15023
15036
  }
15024
15037
  }).pipe(map(({ data }) => data),
@@ -15047,7 +15060,7 @@ class AccountService extends BaseGraphqlService {
15047
15060
  return Toasts.show(this.toastController, this.translate, opts);
15048
15061
  }
15049
15062
  }
15050
- 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" });
15063
+ 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" });
15051
15064
  AccountService.decorators = [
15052
15065
  { type: Injectable, args: [{ providedIn: 'root', deps: [ENVIRONMENT] },] }
15053
15066
  ];
@@ -15315,7 +15328,7 @@ const CONFIGURATION_STORAGE_KEY = 'configuration';
15315
15328
  /* ------------------------------------
15316
15329
  * GraphQL queries
15317
15330
  * ------------------------------------*/
15318
- const Fragments = {
15331
+ const Fragments$1 = {
15319
15332
  config: gql `
15320
15333
  fragment ConfigFragment on ConfigurationVO {
15321
15334
  id
@@ -15342,13 +15355,13 @@ const Fragments = {
15342
15355
  }
15343
15356
  `
15344
15357
  };
15345
- const LoadQuery = gql `
15358
+ const LoadQuery$1 = gql `
15346
15359
  query Configuration{
15347
15360
  data: configuration{
15348
15361
  ...ConfigFragment
15349
15362
  }
15350
15363
  }
15351
- ${Fragments.config}
15364
+ ${Fragments$1.config}
15352
15365
  `;
15353
15366
  // Save (create or update) account mutation
15354
15367
  const SaveMutation = gql `
@@ -15357,7 +15370,7 @@ const SaveMutation = gql `
15357
15370
  ...ConfigFragment
15358
15371
  }
15359
15372
  }
15360
- ${Fragments.config}
15373
+ ${Fragments$1.config}
15361
15374
  `;
15362
15375
  const ClearCache = gql `
15363
15376
  query ClearCache($name: String) {
@@ -15408,12 +15421,12 @@ class ConfigService extends BaseGraphqlService {
15408
15421
  return __awaiter(this, void 0, void 0, function* () {
15409
15422
  const now = Date.now();
15410
15423
  console.debug('[config] Loading Pod configuration...');
15411
- const query = opts && opts.query || LoadQuery;
15424
+ const query = opts && opts.query || LoadQuery$1;
15412
15425
  const variables = opts && opts.variables || undefined;
15413
15426
  const res = yield this.graphql.query({
15414
15427
  query,
15415
15428
  variables,
15416
- error: { code: ErrorCodes$2.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15429
+ error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15417
15430
  fetchPolicy: opts && opts.fetchPolicy || undefined /*default*/
15418
15431
  });
15419
15432
  const data = res && res.data ? Configuration.fromObject(res.data) : undefined;
@@ -15446,7 +15459,7 @@ class ConfigService extends BaseGraphqlService {
15446
15459
  data: json
15447
15460
  },
15448
15461
  error: {
15449
- code: ErrorCodes$2.SAVE_CONFIG_ERROR,
15462
+ code: ErrorCodes.SAVE_CONFIG_ERROR,
15450
15463
  message: 'ERROR.SAVE_CONFIG_ERROR'
15451
15464
  }
15452
15465
  });
@@ -15472,7 +15485,7 @@ class ConfigService extends BaseGraphqlService {
15472
15485
  const res = yield this.graphql.query({
15473
15486
  query: CacheStatistics,
15474
15487
  variables: null,
15475
- error: { code: ErrorCodes$2.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15488
+ error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15476
15489
  fetchPolicy: 'network-only'
15477
15490
  });
15478
15491
  const data = res && res.cacheStatistics || undefined;
@@ -15488,7 +15501,7 @@ class ConfigService extends BaseGraphqlService {
15488
15501
  const res = yield this.graphql.query({
15489
15502
  query: ClearCache,
15490
15503
  variables,
15491
- error: { code: ErrorCodes$2.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15504
+ error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
15492
15505
  fetchPolicy: 'no-cache'
15493
15506
  });
15494
15507
  const data = res && res.clearCache || undefined;
@@ -15647,7 +15660,7 @@ class ConfigService extends BaseGraphqlService {
15647
15660
  });
15648
15661
  }
15649
15662
  }
15650
- 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" });
15663
+ 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" });
15651
15664
  ConfigService.decorators = [
15652
15665
  { type: Injectable, args: [{
15653
15666
  providedIn: 'root',
@@ -15667,7 +15680,7 @@ ConfigService.ctorParameters = () => [
15667
15680
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_CONFIG_OPTIONS,] }] }
15668
15681
  ];
15669
15682
 
15670
- const moment$3 = momentImported;
15683
+ const moment$4 = momentImported;
15671
15684
  const AndroidOsEnvironment = Object.freeze({
15672
15685
  DIRECTORY_DOWNLOADS: 'Download',
15673
15686
  DIRECTORY_DOWNLOADS_OLD: 'Downloads',
@@ -15902,16 +15915,16 @@ class PlatformService extends StartableService {
15902
15915
  }
15903
15916
  // config moment lib
15904
15917
  try {
15905
- moment$3.locale(event.lang);
15918
+ moment$4.locale(event.lang);
15906
15919
  console.debug('[platform] Use locale {' + event.lang + '}');
15907
15920
  }
15908
15921
  // If error, fallback to en
15909
15922
  catch (err) {
15910
- moment$3.locale('en');
15923
+ moment$4.locale('en');
15911
15924
  console.warn('[platform] Unknown local for moment lib. Using default [en]');
15912
15925
  }
15913
15926
  // Config date adapter
15914
- this.dateAdapter.setLocale(moment$3.locale());
15927
+ this.dateAdapter.setLocale(moment$4.locale());
15915
15928
  }
15916
15929
  });
15917
15930
  this.settings.onChange.subscribe(data => {
@@ -15950,8 +15963,7 @@ class PlatformService extends StartableService {
15950
15963
  (_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe(); // Stop timer if exists
15951
15964
  return; // Skip
15952
15965
  }
15953
- const peer = undefined; // location.origin + this.environment.baseUrl;
15954
- const remoteVersion = yield this.networkService.getAppVersion(peer);
15966
+ const remoteVersion = yield this.networkService.getAppVersion();
15955
15967
  if (isNilOrBlank(remoteVersion)) {
15956
15968
  if (production && !silent)
15957
15969
  console.error('[platform] Cannot load remote app version. Skipping version check');
@@ -15960,7 +15972,7 @@ class PlatformService extends StartableService {
15960
15972
  }
15961
15973
  if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
15962
15974
  if (!silent)
15963
- console.info('[platform] Checking remote app version [OK]');
15975
+ console.info(`[platform] Checking remote app version [OK] {remote: '${remoteVersion}', actual: '${actualVersion}'}`);
15964
15976
  return;
15965
15977
  }
15966
15978
  // If newer version exists
@@ -16112,7 +16124,7 @@ class PlatformService extends StartableService {
16112
16124
  });
16113
16125
  }
16114
16126
  }
16115
- 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" });
16127
+ 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" });
16116
16128
  PlatformService.decorators = [
16117
16129
  { type: Injectable, args: [{ providedIn: 'root' },] }
16118
16130
  ];
@@ -16127,15 +16139,15 @@ PlatformService.ctorParameters = () => [
16127
16139
  { type: NetworkService },
16128
16140
  { type: AccountService },
16129
16141
  { type: ConfigService },
16130
- { type: CacheService },
16142
+ { type: CacheService$1 },
16131
16143
  { type: Storage },
16132
16144
  { type: AudioProvider },
16133
16145
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
16134
- { type: StatusBar, decorators: [{ type: Optional }] },
16146
+ { type: StatusBar$1, decorators: [{ type: Optional }] },
16135
16147
  { type: Keyboard, decorators: [{ type: Optional }] },
16136
- { type: SplashScreen, decorators: [{ type: Optional }] },
16137
- { type: InAppBrowser, decorators: [{ type: Optional }] },
16138
- { type: Downloader, decorators: [{ type: Optional }] }
16148
+ { type: SplashScreen$1, decorators: [{ type: Optional }] },
16149
+ { type: InAppBrowser$1, decorators: [{ type: Optional }] },
16150
+ { type: Downloader$1, decorators: [{ type: Optional }] }
16139
16151
  ];
16140
16152
 
16141
16153
  class AppHelpModal {
@@ -16199,7 +16211,7 @@ class MatStepperI18n extends MatStepperIntl {
16199
16211
  this.optionalLabel = this.translate.instant('COMMON.OPTIONAL');
16200
16212
  }
16201
16213
  }
16202
- MatStepperI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16214
+ MatStepperI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(ɵɵinject(TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16203
16215
  MatStepperI18n.decorators = [
16204
16216
  { type: Injectable, args: [{ providedIn: 'root' },] }
16205
16217
  ];
@@ -18035,7 +18047,7 @@ function state2side(state) {
18035
18047
  return 1;
18036
18048
  }
18037
18049
  }
18038
- const ɵ0$1 = (defaultStateSize) => [
18050
+ const ɵ0$b = (defaultStateSize) => [
18039
18051
  Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
18040
18052
  Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
18041
18053
  Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
@@ -18043,7 +18055,7 @@ const ɵ0$1 = (defaultStateSize) => [
18043
18055
  const SCALE_OPTIONS_DEFAULT = {
18044
18056
  startColor: rgbArrayMap.red,
18045
18057
  startStates: [0, 2, 3],
18046
- startStepsFn: ɵ0$1
18058
+ startStepsFn: ɵ0$b
18047
18059
  };
18048
18060
  /**
18049
18061
  * Internal function, that create a colors scale, using iteration
@@ -18840,7 +18852,7 @@ class UserSettingsValidatorService extends AppValidatorService {
18840
18852
  });
18841
18853
  }
18842
18854
  }
18843
- UserSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
18855
+ UserSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(ɵɵinject(FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
18844
18856
  UserSettingsValidatorService.decorators = [
18845
18857
  { type: Injectable, args: [{ providedIn: 'root' },] }
18846
18858
  ];
@@ -18884,7 +18896,7 @@ class AccountValidatorService extends AppValidatorService {
18884
18896
  return validatorFns.length ? Validators.compose(validatorFns) : validatorFns.length === 1 ? validatorFns[0] : undefined;
18885
18897
  }
18886
18898
  }
18887
- AccountValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
18899
+ AccountValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
18888
18900
  AccountValidatorService.decorators = [
18889
18901
  { type: Injectable, args: [{ providedIn: 'root' },] }
18890
18902
  ];
@@ -19449,7 +19461,7 @@ class LocalSettingsValidatorService extends AppValidatorService {
19449
19461
  });
19450
19462
  }
19451
19463
  }
19452
- LocalSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
19464
+ LocalSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(ɵɵinject(FormBuilder), ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
19453
19465
  LocalSettingsValidatorService.decorators = [
19454
19466
  { type: Injectable, args: [{ providedIn: 'root' },] }
19455
19467
  ];
@@ -20068,7 +20080,7 @@ class IsOnFieldModePipe {
20068
20080
  return value === 'FIELD';
20069
20081
  }
20070
20082
  }
20071
- IsOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20083
+ IsOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20072
20084
  IsOnFieldModePipe.decorators = [
20073
20085
  { type: Pipe, args: [{
20074
20086
  name: 'isOnField'
@@ -20080,7 +20092,7 @@ class IsNotOnFieldModePipe {
20080
20092
  return value !== 'FIELD';
20081
20093
  }
20082
20094
  }
20083
- IsNotOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20095
+ IsNotOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20084
20096
  IsNotOnFieldModePipe.decorators = [
20085
20097
  { type: Pipe, args: [{
20086
20098
  name: 'isNotOnField'
@@ -20095,7 +20107,7 @@ class PersonToStringPipe {
20095
20107
  return PersonUtils.personToString(value);
20096
20108
  }
20097
20109
  }
20098
- PersonToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20110
+ PersonToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20099
20111
  PersonToStringPipe.decorators = [
20100
20112
  { type: Pipe, args: [{
20101
20113
  name: 'personToString'
@@ -20480,7 +20492,7 @@ class IsLoginAccountPipe {
20480
20492
  return value && value.pubkey && true;
20481
20493
  }
20482
20494
  }
20483
- IsLoginAccountPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
20495
+ IsLoginAccountPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
20484
20496
  IsLoginAccountPipe.decorators = [
20485
20497
  { type: Pipe, args: [{
20486
20498
  name: 'isLogin'
@@ -20492,7 +20504,7 @@ class AccountToStringPipe {
20492
20504
  return accountToString(value);
20493
20505
  }
20494
20506
  }
20495
- AccountToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
20507
+ AccountToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
20496
20508
  AccountToStringPipe.decorators = [
20497
20509
  { type: Pipe, args: [{
20498
20510
  name: 'accountToString'
@@ -20507,7 +20519,7 @@ class DepartmentToStringPipe {
20507
20519
  return departmentToString(value);
20508
20520
  }
20509
20521
  }
20510
- DepartmentToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
20522
+ DepartmentToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
20511
20523
  DepartmentToStringPipe.decorators = [
20512
20524
  { type: Pipe, args: [{
20513
20525
  name: 'departmentToString'
@@ -20603,7 +20615,7 @@ class MenuService {
20603
20615
  this._visibleSubject.next(value);
20604
20616
  }
20605
20617
  }
20606
- MenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
20618
+ MenuService.ɵprov = ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
20607
20619
  MenuService.decorators = [
20608
20620
  { type: Injectable, args: [{
20609
20621
  providedIn: 'root'
@@ -21059,7 +21071,7 @@ class AuthGuardService {
21059
21071
  }));
21060
21072
  }
21061
21073
  }
21062
- 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" });
21074
+ AuthGuardService.ɵprov = ɵɵdefineInjectable({ factory: function AuthGuardService_Factory() { return new AuthGuardService(ɵɵinject(AccountService), ɵɵinject(ModalController), ɵɵinject(Router), ɵɵinject(ENVIRONMENT)); }, token: AuthGuardService, providedIn: "root" });
21063
21075
  AuthGuardService.decorators = [
21064
21076
  { type: Injectable, args: [{ providedIn: 'root' },] }
21065
21077
  ];
@@ -21101,7 +21113,7 @@ class BaseEntityService extends BaseGraphqlService {
21101
21113
  query,
21102
21114
  variables: { id },
21103
21115
  fetchPolicy: opts && opts.fetchPolicy || undefined,
21104
- error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
21116
+ error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
21105
21117
  })
21106
21118
  .pipe(map(({ data }) => (!opts || opts.toEntity !== false)
21107
21119
  ? (data && this.fromObject(data))
@@ -21116,7 +21128,7 @@ class BaseEntityService extends BaseGraphqlService {
21116
21128
  query,
21117
21129
  variables: { id },
21118
21130
  fetchPolicy: opts && opts.fetchPolicy || undefined,
21119
- error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
21131
+ error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
21120
21132
  });
21121
21133
  // Convert to entity
21122
21134
  return (!opts || opts.toEntity !== false)
@@ -21147,7 +21159,7 @@ class BaseEntityService extends BaseGraphqlService {
21147
21159
  totalFieldName: withTotal ? 'total' : undefined,
21148
21160
  insertFilterFn: filter && filter.asFilterFn(),
21149
21161
  variables,
21150
- error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' },
21162
+ error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' },
21151
21163
  fetchPolicy: opts && opts.fetchPolicy || undefined
21152
21164
  })
21153
21165
  .pipe(map(({ data, total }) => {
@@ -21183,7 +21195,7 @@ class BaseEntityService extends BaseGraphqlService {
21183
21195
  const { data, total } = yield this.graphql.query({
21184
21196
  query,
21185
21197
  variables,
21186
- error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },
21198
+ error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },
21187
21199
  fetchPolicy: opts && opts.fetchPolicy || 'network-only'
21188
21200
  });
21189
21201
  const entities = (!opts || opts.toEntity !== false) ?
@@ -21191,18 +21203,18 @@ class BaseEntityService extends BaseGraphqlService {
21191
21203
  (data || []);
21192
21204
  if (debug)
21193
21205
  console.debug(this._logPrefix + `${this._logTypeName} items loaded in ${Date.now() - now}ms`);
21194
- const res = {
21206
+ const result = {
21195
21207
  data: entities,
21196
- total
21208
+ total: total || entities.length
21197
21209
  };
21198
21210
  // Add fetch more capability, if total was fetched
21199
21211
  if (withTotal) {
21200
21212
  const nextOffset = (offset || 0) + entities.length;
21201
- if (nextOffset < res.total) {
21202
- res.fetchMore = () => this.loadAll(nextOffset, size, sortBy, sortDirection, filter, opts);
21213
+ if (nextOffset < result.total) {
21214
+ result.fetchMore = () => this.loadAll(nextOffset, size, sortBy, sortDirection, filter, opts);
21203
21215
  }
21204
21216
  }
21205
- return res;
21217
+ return result;
21206
21218
  });
21207
21219
  }
21208
21220
  countAll(filter, opts) {
@@ -21222,7 +21234,7 @@ class BaseEntityService extends BaseGraphqlService {
21222
21234
  variables: {
21223
21235
  filter: filter && filter.asPodObject()
21224
21236
  },
21225
- error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'ERROR.COUNT_DATA_ERROR' },
21237
+ error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.COUNT_DATA_ERROR' },
21226
21238
  fetchPolicy: opts && opts.fetchPolicy || 'network-only'
21227
21239
  });
21228
21240
  return res.total;
@@ -21258,7 +21270,7 @@ class BaseEntityService extends BaseGraphqlService {
21258
21270
  variables: {
21259
21271
  data: json
21260
21272
  },
21261
- error: { code: ErrorCodes$2.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
21273
+ error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
21262
21274
  update: (proxy, { data }) => {
21263
21275
  const savedEntities = data && data.data;
21264
21276
  if (savedEntities) {
@@ -21314,7 +21326,7 @@ class BaseEntityService extends BaseGraphqlService {
21314
21326
  variables: {
21315
21327
  data: json
21316
21328
  },
21317
- error: { code: ErrorCodes$2.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
21329
+ error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
21318
21330
  update: (cache, { data }) => {
21319
21331
  // Update entity
21320
21332
  const savedEntity = data && data.data;
@@ -21362,7 +21374,7 @@ class BaseEntityService extends BaseGraphqlService {
21362
21374
  refetchQueries: this.getRefetchQueriesForMutation(opts),
21363
21375
  awaitRefetchQueries: opts && opts.awaitRefetchQueries,
21364
21376
  variables: { ids },
21365
- error: { code: ErrorCodes$2.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
21377
+ error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
21366
21378
  update: (cache, res) => {
21367
21379
  // Remove from cache
21368
21380
  if (this.watchQueriesUpdatePolicy === 'update-cache') {
@@ -21403,7 +21415,7 @@ class BaseEntityService extends BaseGraphqlService {
21403
21415
  refetchQueries: this.getRefetchQueriesForMutation(opts),
21404
21416
  awaitRefetchQueries: opts && opts.awaitRefetchQueries,
21405
21417
  variables: { id },
21406
- error: { code: ErrorCodes$2.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
21418
+ error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
21407
21419
  update: (proxy, res) => {
21408
21420
  // Remove from cache
21409
21421
  if (this.watchQueriesUpdatePolicy === 'update-cache') {
@@ -21439,7 +21451,7 @@ class BaseEntityService extends BaseGraphqlService {
21439
21451
  fetchPolicy: opts && opts.fetchPolicy || 'no-cache',
21440
21452
  variables,
21441
21453
  error: {
21442
- code: ErrorCodes$2.SUBSCRIBE_DATA_ERROR,
21454
+ code: ErrorCodes.SUBSCRIBE_DATA_ERROR,
21443
21455
  message: 'ERROR.SUBSCRIBE_DATA_ERROR'
21444
21456
  }
21445
21457
  })
@@ -21625,7 +21637,7 @@ class EntitiesTableDataSource extends TableDataSource {
21625
21637
  if (this._debug)
21626
21638
  invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._logTypeName} row #${row.id}`));
21627
21639
  // Stop with an error
21628
- throw { code: ErrorCodes$2.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
21640
+ throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
21629
21641
  }
21630
21642
  this._editingRowCount = 0;
21631
21643
  let data;
@@ -22496,14 +22508,14 @@ class AppTable {
22496
22508
  return __awaiter(this, void 0, void 0, function* () {
22497
22509
  opts = Object.assign({ keepEditing: this.keepEditedRowOnSave }, opts);
22498
22510
  if (this.readOnly) {
22499
- throw { code: ErrorCodes$2.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
22511
+ throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
22500
22512
  }
22501
22513
  this.resetError();
22502
22514
  // Keep edited row id (should be done BEFORE confirmEditCreate() )
22503
22515
  this.previouslyEditedRowId = opts.keepEditing ? ((((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.editing) ? this.editedRow.id : undefined) || ((_b = this.singleSelectedRow) === null || _b === void 0 ? void 0 : _b.id)) : undefined;
22504
22516
  const previouslyEditedData = opts.keepEditing ? (isNotNil(this.previouslyEditedRowId) && ((_c = this.editedRow) === null || _c === void 0 ? void 0 : _c.currentData) || ((_d = this.singleSelectedRow) === null || _d === void 0 ? void 0 : _d.currentData)) : undefined;
22505
22517
  if (!this.confirmEditCreate()) {
22506
- throw { code: ErrorCodes$2.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
22518
+ throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
22507
22519
  }
22508
22520
  // Mark as saving
22509
22521
  this.markAsSaving();
@@ -22622,7 +22634,7 @@ class AppTable {
22622
22634
  var _a;
22623
22635
  return __awaiter(this, void 0, void 0, function* () {
22624
22636
  if (this.readOnly) {
22625
- throw { code: ErrorCodes$2.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
22637
+ throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
22626
22638
  }
22627
22639
  if (event === null || event === void 0 ? void 0 : event.defaultPrevented)
22628
22640
  return 0; // SKip
@@ -24202,7 +24214,7 @@ class AppEntityEditor extends AppTabEditor {
24202
24214
  try {
24203
24215
  const data = yield this.dataService.load(id, opts);
24204
24216
  if (!data)
24205
- throw { code: ErrorCodes$2.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
24217
+ throw { code: ErrorCodes.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
24206
24218
  this._usageMode = this.computeUsageMode(data);
24207
24219
  yield this.onEntityLoaded(data, opts);
24208
24220
  yield this.updateView(data, opts);
@@ -24756,9 +24768,10 @@ AppInMemoryTable.propDecorators = {
24756
24768
  canDelete: [{ type: Input }]
24757
24769
  };
24758
24770
 
24759
- const ErrorCodes$1 = {
24771
+ const SocialErrorCodes = {
24760
24772
  LOAD_USER_EVENTS_ERROR: 50000,
24761
- SAVE_USER_EVENT_ERROR: 50001
24773
+ SAVE_USER_EVENT_ERROR: 50001,
24774
+ SEND_MESSAGE_ERROR: 50003
24762
24775
  };
24763
24776
 
24764
24777
  var UserEvent_1;
@@ -24802,7 +24815,7 @@ UserEvent = UserEvent_1 = __decorate([
24802
24815
  EntityClass({ typename: 'UserEventVO' })
24803
24816
  ], UserEvent);
24804
24817
 
24805
- const SocialFragments = {
24818
+ const UserEventFragments = {
24806
24819
  userEvent: gql `fragment UserEventFragment on UserEventVO {
24807
24820
  id
24808
24821
  issuer
@@ -24853,7 +24866,7 @@ let UserEventFilter = class UserEventFilter extends EntityFilter {
24853
24866
  }
24854
24867
  };
24855
24868
  UserEventFilter = __decorate([
24856
- EntityClass({ typename: 'UserEventVO' })
24869
+ EntityClass({ typename: 'UserEventFilterVO' })
24857
24870
  ], UserEventFilter);
24858
24871
  const SaveQuery = gql `
24859
24872
  mutation SaveUserEvent($data: UserEventVOInput){
@@ -24861,7 +24874,7 @@ const SaveQuery = gql `
24861
24874
  ...UserEventFragment
24862
24875
  }
24863
24876
  }
24864
- ${SocialFragments.userEvent}
24877
+ ${UserEventFragments.userEvent}
24865
24878
  `;
24866
24879
  const LoadAllQuery = gql `
24867
24880
  query UserEvents($filter: UserEventFilterVOInput, $page: PageInput){
@@ -24869,7 +24882,7 @@ const LoadAllQuery = gql `
24869
24882
  ...LightUserEventFragment
24870
24883
  }
24871
24884
  }
24872
- ${SocialFragments.lightUserEvent}
24885
+ ${UserEventFragments.lightUserEvent}
24873
24886
  `;
24874
24887
  const DeleteByIdsMutation = gql `
24875
24888
  mutation DeleteUserEvents($ids:[Int]){
@@ -24882,7 +24895,7 @@ const LoadAllWithContentQuery = gql `
24882
24895
  ...UserEventFragment
24883
24896
  }
24884
24897
  }
24885
- ${SocialFragments.userEvent}
24898
+ ${UserEventFragments.userEvent}
24886
24899
  `;
24887
24900
  class UserEventService extends BaseGraphqlService {
24888
24901
  constructor(graphql, accountService, network, translate, toastController, environment) {
@@ -24895,7 +24908,7 @@ class UserEventService extends BaseGraphqlService {
24895
24908
  this.environment = environment;
24896
24909
  this._userEventActions = [];
24897
24910
  // For DEV only
24898
- this._debug = !environment.production;
24911
+ this._debug = environment && !environment.production;
24899
24912
  }
24900
24913
  /**
24901
24914
  *
@@ -24932,7 +24945,7 @@ class UserEventService extends BaseGraphqlService {
24932
24945
  filter: filter && filter.asPodObject()
24933
24946
  },
24934
24947
  arrayFieldName: 'data',
24935
- error: { code: ErrorCodes$1.LOAD_USER_EVENTS_ERROR, message: 'SOCIAL.ERROR.LOAD_USER_EVENTS_ERROR' },
24948
+ error: { code: SocialErrorCodes.LOAD_USER_EVENTS_ERROR, message: 'SOCIAL.ERROR.LOAD_USER_EVENTS_ERROR' },
24936
24949
  fetchPolicy: options && options.fetchPolicy || undefined
24937
24950
  })
24938
24951
  .pipe(map(res => {
@@ -24970,7 +24983,7 @@ class UserEventService extends BaseGraphqlService {
24970
24983
  variables: {
24971
24984
  data: json
24972
24985
  },
24973
- error: { code: ErrorCodes$1.SAVE_USER_EVENT_ERROR, message: 'SOCIAL.ERROR.SAVE_USER_EVENT_ERROR' },
24986
+ error: { code: SocialErrorCodes.SAVE_USER_EVENT_ERROR, message: 'SOCIAL.ERROR.SAVE_USER_EVENT_ERROR' },
24974
24987
  update: (proxy, { data }) => {
24975
24988
  // Update entity
24976
24989
  const savedEntity = data && data.data;
@@ -25154,7 +25167,7 @@ class UserEventService extends BaseGraphqlService {
25154
25167
  EntityUtils.copyIdAndUpdateDate(source, target);
25155
25168
  }
25156
25169
  }
25157
- UserEventService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserEventService_Factory() { return new UserEventService(i0.ɵɵinject(GraphqlService), i0.ɵɵinject(AccountService), i0.ɵɵinject(NetworkService), i0.ɵɵinject(i1$1.TranslateService), i0.ɵɵinject(i1$4.ToastController), i0.ɵɵinject(ENVIRONMENT)); }, token: UserEventService, providedIn: "root" });
25170
+ UserEventService.ɵprov = ɵɵdefineInjectable({ factory: function UserEventService_Factory() { return new UserEventService(ɵɵinject(GraphqlService), ɵɵinject(AccountService), ɵɵinject(NetworkService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT, 8)); }, token: UserEventService, providedIn: "root" });
25158
25171
  UserEventService.decorators = [
25159
25172
  { type: Injectable, args: [{ providedIn: 'root' },] }
25160
25173
  ];
@@ -25164,7 +25177,7 @@ UserEventService.ctorParameters = () => [
25164
25177
  { type: NetworkService },
25165
25178
  { type: TranslateService },
25166
25179
  { type: ToastController },
25167
- { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] }
25180
+ { type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
25168
25181
  ];
25169
25182
 
25170
25183
  const ICONS_MAP = {
@@ -25291,7 +25304,7 @@ class UserEventsTable extends AppTable {
25291
25304
  UserEventsTable.decorators = [
25292
25305
  { type: Component, args: [{
25293
25306
  selector: 'app-user-events-table',
25294
- template: "\n<!-- Type = options menu -->\n<mat-menu #optionsMenu=\"matMenu\" xPosition=\"after\">\n\n <!-- display columns -->\n <button mat-menu-item\n (click)=\"openSelectColumnsModal($event)\">\n <mat-icon>view_column</mat-icon>\n <ion-label translate>COMMON.DISPLAYED_COLUMNS_DOTS</ion-label>\n </button>\n\n</mat-menu>\n\n<!-- top header -->\n<mat-toolbar>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n\n <button mat-icon-button [title]=\"'COMMON.BTN_REFRESH'|translate\" (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button class=\"hidden-xs hidden-sm\" *ngIf=\"canDelete\"\n [title]=\"'COMMON.BTN_DELETE'|translate\" (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" hidden-xs hidden-sm hidden-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button mat-icon-button\n [title]=\"'COMMON.BTN_OPTIONS'|translate\"\n [matMenuTriggerFor]=\"optionsMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n</mat-toolbar>\n\n\n<mat-table [dataSource]=\"dataSource\" matSort\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <!-- select -->\n <ng-container matColumnDef=\"select\">\n <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 </mat-header-cell>\n <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 </mat-cell>\n </ng-container>\n\n <!-- id -->\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef mat-sort-header [class.cdk-visually-hidden]=\"!isAdmin\">\n <app-loading-spinner [loading]=\"loadingSubject|async\"><ion-label>#</ion-label></app-loading-spinner>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!isAdmin\">{{ row.currentData.id | mathAbs }}</mat-cell>\n </ng-container>\n\n <!-- creationDate -->\n <ng-container matColumnDef=\"creationDate\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.CREATION_DATE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\">\n <ion-text>\n {{row.currentData.creationDate | dateFromNow }}<br/>\n <ion-text color=\"medium\"><small>{{row.currentData.creationDate | dateFormat: {time: true} }}</small></ion-text>\n </ion-text>\n </mat-cell>\n </ng-container>\n\n <!-- icon -->\n <ng-container matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"getIcon(row.currentData); let details\">\n <ion-icon slot=\"start\" *ngIf=\"details.icon\" [name]=\"details.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"details.matIcon\">{{details.matIcon}}</mat-icon>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <!-- event type -->\n <ng-container matColumnDef=\"eventType\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.EVENT_TYPE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <span>{{'SOCIAL.EVENT_TYPE_ENUM.' + row.currentData.eventType | translate}}</span>\n </mat-cell>\n </ng-container>\n\n <!-- message -->\n <ng-container matColumnDef=\"message\">\n <mat-header-cell *matHeaderCellDef>\n <ion-label translate>SOCIAL.USER_EVENT.MESSAGE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"getDetail(row.currentData); let details\">\n <ion-text [innerHTML]=\"details.title|translate\">\n </ion-text>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <!-- Actions buttons column -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\">\n <ng-container *ngIf=\"getDetail(row.currentData); let details\">\n <button mat-icon-button color=\"light\"\n *ngFor=\"let action of details.actions\"\n [title]=\"action.title |translate\"\n [color]=\"action.color\"\n (click)=\"doAction(action, row)\">\n <ion-icon slot=\"start\" *ngIf=\"action.icon\" [name]=\"action.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"action.matIcon\">{{action.matIcon}}</mat-icon>\n </button>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n class=\"mat-row-disabled\"\n (click)=\"clickRow($event, row)\"></mat-row>\n\n</mat-table>\n\n<ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col class=\"ion-no-padding\" size=\"auto\">\n <mat-paginator [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n </ion-col>\n</ion-row>\n",
25307
+ template: "\n<!-- Type = options menu -->\n<mat-menu #optionsMenu=\"matMenu\" xPosition=\"after\">\n\n <!-- display columns -->\n <button mat-menu-item\n (click)=\"openSelectColumnsModal($event)\">\n <mat-icon>view_column</mat-icon>\n <ion-label translate>COMMON.DISPLAYED_COLUMNS_DOTS</ion-label>\n </button>\n\n</mat-menu>\n\n<!-- top header -->\n<mat-toolbar>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n\n <button mat-icon-button [title]=\"'COMMON.BTN_REFRESH'|translate\" (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button class=\"hidden-xs hidden-sm\" *ngIf=\"canDelete\"\n [title]=\"'COMMON.BTN_DELETE'|translate\" (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" hidden-xs hidden-sm hidden-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button mat-icon-button\n [title]=\"'COMMON.BTN_OPTIONS'|translate\"\n [matMenuTriggerFor]=\"optionsMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n</mat-toolbar>\n\n\n<mat-table [dataSource]=\"dataSource\" matSort\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <!-- select -->\n <ng-container matColumnDef=\"select\">\n <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 </mat-header-cell>\n <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 </mat-cell>\n </ng-container>\n\n <!-- id -->\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef mat-sort-header [class.cdk-visually-hidden]=\"!isAdmin\">\n <app-loading-spinner [loading]=\"loadingSubject|async\"><ion-label>#</ion-label></app-loading-spinner>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!isAdmin\">{{ row.currentData.id | mathAbs }}</mat-cell>\n </ng-container>\n\n <!-- creationDate -->\n <ng-container matColumnDef=\"creationDate\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.CREATION_DATE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\">\n <ion-text>\n {{row.currentData.creationDate | dateFromNow }}<br/>\n <ion-text color=\"medium\"><small>{{row.currentData.creationDate | dateFormat: {time: true} }}</small></ion-text>\n </ion-text>\n </mat-cell>\n </ng-container>\n\n <!-- icon -->\n <ng-container matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"getIcon(row.currentData); let details\">\n <ion-icon slot=\"start\" *ngIf=\"details.icon\" [name]=\"details.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"details.matIcon\">{{details.matIcon}}</mat-icon>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <!-- event type -->\n <ng-container matColumnDef=\"eventType\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.EVENT_TYPE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <span>{{'SOCIAL.USER_EVENT.TYPE_ENUM.' + row.currentData.eventType | translate}}</span>\n </mat-cell>\n </ng-container>\n\n <!-- message -->\n <ng-container matColumnDef=\"message\">\n <mat-header-cell *matHeaderCellDef>\n <ion-label translate>SOCIAL.USER_EVENT.MESSAGE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"getDetail(row.currentData); let details\">\n <ion-text [innerHTML]=\"details.title|translate\">\n </ion-text>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <!-- Actions buttons column -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\">\n <ng-container *ngIf=\"getDetail(row.currentData); let details\">\n <button mat-icon-button color=\"light\"\n *ngFor=\"let action of details.actions\"\n [title]=\"action.title |translate\"\n [color]=\"action.color\"\n (click)=\"doAction(action, row)\">\n <ion-icon slot=\"start\" *ngIf=\"action.icon\" [name]=\"action.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"action.matIcon\">{{action.matIcon}}</mat-icon>\n </button>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n class=\"mat-row-disabled\"\n (click)=\"clickRow($event, row)\"></mat-row>\n\n</mat-table>\n\n<ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col class=\"ion-no-padding\" size=\"auto\">\n <mat-paginator [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n </ion-col>\n</ion-row>\n",
25295
25308
  changeDetection: ChangeDetectionStrategy.OnPush,
25296
25309
  styles: [".mat-header-row .mat-column-icon,.mat-row .mat-column-icon{max-width:40px;padding-left:0}.mat-header-row .mat-column-icon ion-icon,.mat-header-row .mat-column-icon mat-icon,.mat-row .mat-column-icon ion-icon,.mat-row .mat-column-icon mat-icon{font-size:1.2em;height:1.2em;width:1.2em}.mat-header-row .mat-column-creationDate,.mat-row .mat-column-creationDate{min-width:100px;max-width:120px}"]
25297
25310
  },] }
@@ -25311,32 +25324,309 @@ UserEventsTable.propDecorators = {
25311
25324
  defaultSortDirection: [{ type: Input }]
25312
25325
  };
25313
25326
 
25314
- class SocialModule {
25315
- static forRoot() {
25316
- console.debug('[social] Creating module (root)');
25317
- return {
25318
- ngModule: SocialModule,
25319
- providers: [
25320
- UserEventService
25321
- ]
25322
- };
25327
+ const MessageTypes = {
25328
+ INBOX_MESSAGE: 'INBOX_MESSAGE',
25329
+ EMAIL: 'EMAIL',
25330
+ FEED: 'FEED',
25331
+ };
25332
+ const MessageTypeList = Object.freeze([
25333
+ {
25334
+ id: MessageTypes.INBOX_MESSAGE,
25335
+ icon: 'notifications',
25336
+ label: 'SOCIAL.MESSAGE.TYPE_ENUM.INBOX_MESSAGE'
25337
+ },
25338
+ {
25339
+ id: MessageTypes.EMAIL,
25340
+ icon: 'mail',
25341
+ label: 'SOCIAL.MESSAGE.TYPE_ENUM.EMAIL'
25342
+ },
25343
+ {
25344
+ id: MessageTypes.FEED,
25345
+ icon: 'paper',
25346
+ label: 'SOCIAL.MESSAGE.TYPE_ENUM.FEED'
25347
+ }
25348
+ ]);
25349
+ // @dynamic
25350
+ let Message = class Message extends Entity {
25351
+ constructor() {
25352
+ super();
25353
+ }
25354
+ fromObject(source, opts) {
25355
+ super.fromObject(source, opts);
25356
+ this.type = source.type;
25357
+ this.issuer = source.issuer && Person.fromObject(source.issuer);
25358
+ this.recipients = source.recipients && source.recipients.map(Person.fromObject);
25359
+ this.subject = source.subject;
25360
+ this.body = source.body;
25361
+ }
25362
+ asObject(opts) {
25363
+ const target = super.asObject(opts);
25364
+ target.recipients = this.recipients && this.recipients.map(p => p.asObject(opts));
25365
+ return target;
25366
+ }
25367
+ };
25368
+ Message = __decorate([
25369
+ EntityClass({ typename: 'MessageVO' })
25370
+ ], Message);
25371
+ // @dynamic
25372
+ let MessageFilter = class MessageFilter extends EntityFilter {
25373
+ fromObject(source, opts) {
25374
+ super.fromObject(source, opts);
25375
+ }
25376
+ buildFilter() {
25377
+ const filterFns = super.buildFilter();
25378
+ return filterFns;
25379
+ }
25380
+ };
25381
+ MessageFilter = __decorate([
25382
+ EntityClass({ typename: 'MessageFilterVO' })
25383
+ ], MessageFilter);
25384
+
25385
+ class MessageModal {
25386
+ constructor(settings, viewCtrl, accountService, cd) {
25387
+ this.settings = settings;
25388
+ this.viewCtrl = viewCtrl;
25389
+ this.accountService = accountService;
25390
+ this.cd = cd;
25391
+ this.mobile = this.settings.mobile;
25392
+ }
25393
+ ngOnInit() {
25394
+ this.canSelectType = toBoolean(this.canSelectType, this.accountService.isAdmin());
25395
+ }
25396
+ ngAfterViewInit() {
25397
+ this.form.markAsReady({ emitEvent: false });
25398
+ if (this.data) {
25399
+ this.data.type = this.data.type || MessageTypes.INBOX_MESSAGE;
25400
+ this.form.setValue(this.data);
25401
+ }
25402
+ this.form.markAsLoaded();
25403
+ this.form.enable();
25404
+ }
25405
+ cancel(event) {
25406
+ this.viewCtrl.dismiss();
25407
+ }
25408
+ doSubmit(event) {
25409
+ return __awaiter(this, void 0, void 0, function* () {
25410
+ if (this.form.disabled)
25411
+ return;
25412
+ if (!this.form.valid) {
25413
+ yield AppFormUtils.waitWhilePending(this.form);
25414
+ if (this.form.invalid) {
25415
+ AppFormUtils.logFormErrors(this.form.form, '[message-modal] ');
25416
+ this.form.markAllAsTouched();
25417
+ return;
25418
+ }
25419
+ }
25420
+ this.markAsLoading();
25421
+ try {
25422
+ const data = this.form.value;
25423
+ // Disable the form
25424
+ this.form.disable();
25425
+ const entity = Message.fromObject(data);
25426
+ return this.viewCtrl.dismiss(entity);
25427
+ }
25428
+ catch (err) {
25429
+ this.form.error = err && err.message || err;
25430
+ this.markAsLoaded();
25431
+ // Enable the form
25432
+ this.form.enable();
25433
+ // Reset form error on next changes
25434
+ firstNotNilPromise(this.form.form.valueChanges).then(() => {
25435
+ this.form.error = null;
25436
+ this.markForCheck();
25437
+ });
25438
+ return;
25439
+ }
25440
+ });
25441
+ }
25442
+ markForCheck() {
25443
+ this.cd.markForCheck();
25444
+ }
25445
+ markAsLoading(opts) {
25446
+ this.form.markAsLoading(opts);
25447
+ }
25448
+ markAsLoaded(opts) {
25449
+ this.form.markAsLoaded(opts);
25323
25450
  }
25324
25451
  }
25452
+ MessageModal.decorators = [
25453
+ { type: Component, args: [{
25454
+ selector: 'app-message-modal',
25455
+ template: "<ion-header>\n <ion-toolbar color=\"secondary\">\n <ion-buttons slot=\"start\">\n <ion-button class=\"back-button\" (click)=\"cancel($event)\" visible-xs visible-sm visible-mobile>\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n </ion-buttons>\n\n <ion-title>\n {{'SOCIAL.MESSAGE.NEW.TITLE' | translate}}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n\n <ion-button class=\"back-button\" (click)=\"doSubmit($event)\"\n [disabled]=\"!form.valid\"\n visible-xs visible-sm visible-mobile>\n <ion-icon slot=\"icon-only\" name=\"checkmark\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n\n<ion-content class=\"ion-padding\" >\n\n <ion-item *ngIf=\"form.error\" visible-xs visible-sm visible-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"form.error|translate\"></ion-label>\n </ion-item>\n\n <app-message-form #form (onSubmit)=\"doSubmit($event)\"\n (onCancel)=\"cancel($event)\"\n [canSelectType]=\"canSelectType\"\n [suggestFn]=\"suggestFn\">\n </app-message-form>\n\n</ion-content>\n\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n\n <ion-toolbar>\n\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <!-- buttons -->\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel($event)\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n\n <ion-button [fill]=\"form.invalid ? 'clear' : 'solid'\"\n [disabled]=\"form.loading || form.invalid\"\n (keyup.enter)=\"doSubmit($event)\"\n (click)=\"doSubmit($event)\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_SEND</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n\n\n </ion-toolbar>\n</ion-footer>\n",
25456
+ changeDetection: ChangeDetectionStrategy.OnPush
25457
+ },] }
25458
+ ];
25459
+ MessageModal.ctorParameters = () => [
25460
+ { type: LocalSettingsService },
25461
+ { type: ModalController },
25462
+ { type: AccountService },
25463
+ { type: ChangeDetectorRef }
25464
+ ];
25465
+ MessageModal.propDecorators = {
25466
+ suggestFn: [{ type: Input }],
25467
+ data: [{ type: Input }],
25468
+ canSelectType: [{ type: Input }],
25469
+ form: [{ type: ViewChild, args: ['form', { static: true },] }]
25470
+ };
25471
+
25472
+ class MessageForm extends AppForm {
25473
+ constructor(injector, formBuilder, cd) {
25474
+ super(injector);
25475
+ this.formBuilder = formBuilder;
25476
+ this.cd = cd;
25477
+ this.subjectMinLength = 5;
25478
+ this.subjectMaxLength = 255;
25479
+ this.bodyMaxLength = 2000;
25480
+ this.bodyAutoHeight = true;
25481
+ this.canSelectType = false;
25482
+ this.types = MessageTypeList;
25483
+ this.mobile = this.settings.mobile;
25484
+ }
25485
+ ngOnInit() {
25486
+ this.setForm(this.formBuilder.group({
25487
+ type: [MessageTypes.INBOX_MESSAGE, Validators.required],
25488
+ recipients: [null, Validators.required],
25489
+ subject: [null, this.subjectMaxLength
25490
+ ? Validators.compose([Validators.required, Validators.minLength(this.subjectMinLength), Validators.maxLength(this.subjectMaxLength)])
25491
+ : Validators.required],
25492
+ body: [null, this.bodyMaxLength
25493
+ ? Validators.compose([Validators.maxLength(this.bodyMaxLength)])
25494
+ : Validators.required]
25495
+ }));
25496
+ const personAttributes = this.settings.getFieldDisplayAttributes('person', ['lastName', 'firstName', 'department.name']);
25497
+ this.registerAutocompleteField('recipients', {
25498
+ showAllOnFocus: false,
25499
+ suggestFn: this.suggestFn,
25500
+ filter: {
25501
+ statusIds: [StatusIds.TEMPORARY, StatusIds.ENABLE]
25502
+ },
25503
+ attributes: personAttributes,
25504
+ displayWith: PersonUtils.personToString,
25505
+ multiple: true,
25506
+ mobile: this.mobile
25507
+ });
25508
+ }
25509
+ isSamePerson(o1, o2) {
25510
+ return EntityUtils.equals(o1, o2, 'id');
25511
+ }
25512
+ markForCheck() {
25513
+ this.cd.markForCheck();
25514
+ }
25515
+ }
25516
+ MessageForm.decorators = [
25517
+ { type: Component, args: [{
25518
+ selector: 'app-message-form',
25519
+ template: "\n\n<form [formGroup]=\"form\" class=\"form-container\">\n\n <!-- type -->\n <mat-form-field *ngIf=\"canSelectType\">\n <mat-select formControlName=\"type\" [placeholder]=\"'SOCIAL.MESSAGE.TYPE'|translate\">\n <mat-option *ngFor=\"let item of types\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <!-- Recipients -->\n <mat-chips-field *ngIf=\"(form.controls.type.valueChanges|async) !== 'FEED'\"\n formControlName=\"recipients\"\n [placeholder]=\"'SOCIAL.MESSAGE.RECIPIENTS'|translate\"\n [config]=\"autocompleteFields.recipients\"\n [equals]=\"isSamePerson\">\n </mat-chips-field>\n\n <!-- Subject -->\n <mat-form-field>\n <input matInput type=\"text\"\n [placeholder]=\"'SOCIAL.MESSAGE.SUBJECT'|translate\"\n formControlName=\"subject\"\n autocomplete=\"off\"\n required>\n <mat-error *ngIf=\"form.controls.subject.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"form.controls.subject.hasError('minlength')\">\n {{ 'ERROR.FIELD_MIN_LENGTH_COMPACT'|translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.subject.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH_COMPACT'|translate }}\n </mat-error>\n <mat-hint *ngIf=\"subjectMaxLength\" align=\"end\">\n {{ 'INFO.TEXT_PROGRESS' | translate: { current: form.controls.subject.value?.length || 0, max: subjectMaxLength } }}\n </mat-hint>\n </mat-form-field>\n\n <!-- Body -->\n <mat-form-field floatLabel=\"never\">\n <textarea matInput type=\"text\"\n [placeholder]=\"'SOCIAL.MESSAGE.BODY_HELP'|translate\"\n formControlName=\"body\"\n [class.fixed-height]=\"!bodyAutoHeight\"\n [cdkTextareaAutosize]=\"bodyAutoHeight\"\n (keydown.control.enter)=\"doSubmit($event)\"\n >\n </textarea>\n <mat-error *ngIf=\"form.controls.body.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH' | translate: form.controls.body.errors.maxlength }}\n </mat-error>\n <mat-hint *ngIf=\"bodyMaxLength\" align=\"end\">\n {{ 'INFO.TEXT_PROGRESS' | translate: { current: form.controls.body.value?.length || 0, max: bodyMaxLength } }}\n </mat-hint>\n </mat-form-field>\n\n</form>\n",
25520
+ changeDetection: ChangeDetectionStrategy.OnPush,
25521
+ styles: ["textarea.fixed-height{height:11.5em}textarea{min-height:11.5em}"]
25522
+ },] }
25523
+ ];
25524
+ MessageForm.ctorParameters = () => [
25525
+ { type: Injector },
25526
+ { type: FormBuilder },
25527
+ { type: ChangeDetectorRef }
25528
+ ];
25529
+ MessageForm.propDecorators = {
25530
+ suggestFn: [{ type: Input }],
25531
+ subjectMinLength: [{ type: Input }],
25532
+ subjectMaxLength: [{ type: Input }],
25533
+ bodyMaxLength: [{ type: Input }],
25534
+ bodyAutoHeight: [{ type: Input }],
25535
+ canSelectType: [{ type: Input }]
25536
+ };
25537
+
25538
+ class SocialModule {
25539
+ }
25325
25540
  SocialModule.decorators = [
25326
25541
  { type: NgModule, args: [{
25327
25542
  imports: [
25328
25543
  CommonModule,
25329
- CoreModule
25544
+ CoreModule,
25545
+ SharedModule
25330
25546
  ],
25331
25547
  declarations: [
25332
- UserEventsTable
25548
+ UserEventsTable,
25549
+ MessageModal,
25550
+ MessageForm
25333
25551
  ],
25334
25552
  exports: [
25335
- UserEventsTable
25553
+ UserEventsTable,
25554
+ MessageModal
25336
25555
  ]
25337
25556
  },] }
25338
25557
  ];
25339
25558
 
25559
+ const Mutations = {
25560
+ send: gql `mutation SendMessage($data: MessageVOInput){
25561
+ done: sendMessage(message: $data)
25562
+ }`
25563
+ };
25564
+ class MessageService extends BaseGraphqlService {
25565
+ constructor(graphql, translate, toastController, environment) {
25566
+ super(graphql, environment);
25567
+ this.graphql = graphql;
25568
+ this.translate = translate;
25569
+ this.toastController = toastController;
25570
+ this.environment = environment;
25571
+ // For DEV only
25572
+ this._debug = !environment.production;
25573
+ }
25574
+ /**
25575
+ * Send a message to recipient(s)
25576
+ *
25577
+ * @param entity
25578
+ * @param opts
25579
+ */
25580
+ send(entity, opts) {
25581
+ return __awaiter(this, void 0, void 0, function* () {
25582
+ // Transform into json
25583
+ const data = entity.asObject(MINIFY_ENTITY_FOR_POD);
25584
+ const now = Date.now();
25585
+ if (this._debug)
25586
+ console.debug(`[message-service] Send message...`, data);
25587
+ try {
25588
+ const { done } = yield this.graphql.mutate({
25589
+ mutation: Mutations.send,
25590
+ variables: { data },
25591
+ error: { code: SocialErrorCodes.SEND_MESSAGE_ERROR, message: 'SOCIAL.ERROR.SEND_MESSAGE_ERROR' }
25592
+ });
25593
+ if (this._debug)
25594
+ console.debug(`[message-service] Send message [OK] in ${Date.now() - now}ms`);
25595
+ if (done && (!opts || opts.showToast !== false)) {
25596
+ yield this.showToast({ type: 'info', message: 'SOCIAL.INFO.MESSAGE_SENT' });
25597
+ }
25598
+ return done;
25599
+ }
25600
+ catch (err) {
25601
+ const error = err && err.message || err;
25602
+ console.error(error);
25603
+ // Show error
25604
+ if (!opts || opts.showToast !== false) {
25605
+ let message = error || 'SOCIAL.ERROR.SEND_MESSAGE_ERROR';
25606
+ yield this.showToast({ type: 'error', message });
25607
+ }
25608
+ return false;
25609
+ }
25610
+ });
25611
+ }
25612
+ /* -- protected methods -- */
25613
+ showToast(opts) {
25614
+ return __awaiter(this, void 0, void 0, function* () {
25615
+ return Toasts.show(this.toastController, this.translate, Object.assign({ type: 'info', message: 'SOCIAL.INFO.MESSAGE_SENT' }, opts));
25616
+ });
25617
+ }
25618
+ }
25619
+ MessageService.ɵprov = ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(ɵɵinject(GraphqlService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT, 8)); }, token: MessageService, providedIn: "root" });
25620
+ MessageService.decorators = [
25621
+ { type: Injectable, args: [{ providedIn: 'root' },] }
25622
+ ];
25623
+ MessageService.ctorParameters = () => [
25624
+ { type: GraphqlService },
25625
+ { type: TranslateService },
25626
+ { type: ToastController },
25627
+ { type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
25628
+ ];
25629
+
25340
25630
  var PersonFilter_1;
25341
25631
  // @dynamic
25342
25632
  let PersonFilter = PersonFilter_1 = class PersonFilter extends EntityFilter {
@@ -25535,7 +25825,7 @@ class PersonService extends BaseEntityService {
25535
25825
  return target;
25536
25826
  }
25537
25827
  }
25538
- 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" });
25828
+ PersonService.ɵprov = ɵɵdefineInjectable({ factory: function PersonService_Factory() { return new PersonService(ɵɵinject(GraphqlService), ɵɵinject(PlatformService), ɵɵinject(NetworkService), ɵɵinject(EntitiesStorage)); }, token: PersonService, providedIn: "root" });
25539
25829
  PersonService.decorators = [
25540
25830
  { type: Injectable, args: [{ providedIn: 'root' },] }
25541
25831
  ];
@@ -25566,7 +25856,7 @@ class PersonValidatorService {
25566
25856
  return this.formBuilder.group(formConfig);
25567
25857
  }
25568
25858
  }
25569
- PersonValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
25859
+ PersonValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
25570
25860
  PersonValidatorService.decorators = [
25571
25861
  { type: Injectable, args: [{ providedIn: 'root' },] }
25572
25862
  ];
@@ -25576,7 +25866,7 @@ PersonValidatorService.ctorParameters = () => [
25576
25866
  ];
25577
25867
 
25578
25868
  class UsersPage extends AppTable {
25579
- constructor(injector, accountService, validatorService, configService, dataService, cd, formBuilder, environment) {
25869
+ constructor(injector, formBuilder, accountService, validatorService, configService, dataService, messageService, cd, environment) {
25580
25870
  super(injector, RESERVED_START_COLUMNS
25581
25871
  .concat([
25582
25872
  'avatar',
@@ -25601,16 +25891,17 @@ class UsersPage extends AppTable {
25601
25891
  this.validatorService = validatorService;
25602
25892
  this.configService = configService;
25603
25893
  this.dataService = dataService;
25894
+ this.messageService = messageService;
25604
25895
  this.cd = cd;
25605
- this.canEdit = false;
25606
25896
  this.profiles = [...PRIORITIZED_AUTHORITIES].reverse();
25607
- this.filterCriteriaCount = 0;
25608
25897
  this.statusList = StatusList;
25609
25898
  this.statusById = StatusById;
25899
+ this.filterCriteriaCount = 0;
25610
25900
  this.useSticky = false;
25611
25901
  this.referentialToString = referentialToString;
25612
- this.inlineEdition = accountService.isAdmin(); // Allow inline edition only if admin
25613
25902
  this.canEdit = accountService.isAdmin();
25903
+ this.canSendMessage = this.canEdit;
25904
+ this.inlineEdition = this.canEdit;
25614
25905
  this.confirmBeforeDelete = true;
25615
25906
  this.autoLoad = false; // Wait config loading
25616
25907
  this.i18nColumnPrefix = 'USER.';
@@ -25703,6 +25994,39 @@ class UsersPage extends AppTable {
25703
25994
  formControl.setValue(null);
25704
25995
  return false;
25705
25996
  }
25997
+ openComposeMessageModal(event) {
25998
+ return __awaiter(this, void 0, void 0, function* () {
25999
+ // Get recipients
26000
+ const recipients = (this.selection.selected || [])
26001
+ .map(row => row.currentData)
26002
+ .map(Person.fromObject)
26003
+ .map(p => {
26004
+ var _a;
26005
+ const target = p.asObject({ minify: true });
26006
+ target.department = (_a = p.department) === null || _a === void 0 ? void 0 : _a.asObject();
26007
+ return target;
26008
+ });
26009
+ const hasTopModal = !!(yield this.modalCtrl.getTop());
26010
+ const modal = yield this.modalCtrl.create({
26011
+ component: MessageModal,
26012
+ componentProps: {
26013
+ suggestFn: (value, filter, sortBy, sortDirection) => this.dataService.suggest(value, filter, sortBy, sortDirection),
26014
+ data: {
26015
+ recipients
26016
+ }
26017
+ },
26018
+ cssClass: hasTopModal && 'stack-modal'
26019
+ });
26020
+ // Open the modal
26021
+ yield modal.present();
26022
+ // On dismiss
26023
+ const { data } = yield modal.onDidDismiss();
26024
+ if (!data || !(data instanceof Message))
26025
+ return; // CANCELLED
26026
+ console.info('[users] received message to send: ', data);
26027
+ yield this.messageService.send(data);
26028
+ });
26029
+ }
25706
26030
  /* -- protected methods -- */
25707
26031
  markForCheck() {
25708
26032
  this.cd.markForCheck();
@@ -25711,7 +26035,7 @@ class UsersPage extends AppTable {
25711
26035
  UsersPage.decorators = [
25712
26036
  { type: Component, args: [{
25713
26037
  selector: 'app-users-table',
25714
- template: "<app-toolbar [title]=\"'USER.LIST.TITLE'|translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\">\n <ion-buttons slot=\"end\">\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n </ng-container>\n\n <ng-template #hasSelection>\n <!-- delete -->\n <button mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.LIST.FILTER.SEARCH'|translate\" formControlName=\"searchText\">\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-select formControlName=\"statusId\" [placeholder]=\"'USER.STATUS'|translate\">\n <mat-option [value]=\"null\"><i><span translate>COMMON.EMPTY_OPTION</span></i></mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" visible-xs visible-sm visible-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"table-container\">\n <table #table mat-table matSort\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\" [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"avatar\" *ngIf=\"row.currentData.avatar; else generateIcon\"\n [ngStyle]=\"{'background-image':'url('+row.currentData.avatar+')'}\"></div>\n <ng-template #generateIcon>\n <div class=\"avatar\">\n <svg width=\"38\" width=\"38\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </div>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='lastName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='lastName'\">\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n </td>\n\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n\n (click)=\"focusColumn='firstName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='firstName'\">\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='email'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='email'\">\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{definition.label|translate}}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn=definition.key\">\n <app-form-field floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn===definition.ke\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='profile'\">\n <mat-form-field floatLabel=\"never\">\n <mat-select [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE'|translate\">\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ ('USER.PROFILE_ENUM.' + item) | uppercase |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='status'\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value &gt;=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value &gt;=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='username'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='username'\">\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='usernameExtranet'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='usernameExtranet'\">\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [title]=\"row.validator.controls['pubkey'].value\"\n (click)=\"focusColumn='pubkey'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls['pubkey']\" [placeholder]=\"'USER.PUBKEY'|translate\"\n [readonly]=\"!row.editing\" autocomplete=\"off\">\n <mat-error *ngIf=\"row.validator.controls['pubkey'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['pubkey'].hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-footer>\n <mat-paginator class=\"mat-paginator-footer\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"!mobile && inlineEdition\"\n (onCancel)=\"onRefresh.emit()\" (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\"></app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n",
26038
+ template: "<app-toolbar [title]=\"'USER.LIST.TITLE'|translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\">\n <ion-buttons slot=\"end\">\n\n <!-- Compose message -->\n <button mat-icon-button *ngIf=\"canSendMessage\"\n [title]=\"'USER.LIST.BTN_SEND_MESSAGE'|translate\"\n (click)=\"openComposeMessageModal($event)\">\n <ion-icon name=\"mail\" slot=\"icon-only\"></ion-icon>\n </button>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n </ng-container>\n\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.LIST.FILTER.SEARCH'|translate\" formControlName=\"searchText\">\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-select formControlName=\"statusId\" [placeholder]=\"'USER.STATUS'|translate\">\n <mat-option [value]=\"null\"><i><span translate>COMMON.EMPTY_OPTION</span></i></mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" visible-xs visible-sm visible-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"table-container\">\n <table #table mat-table matSort\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\" [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"avatar\" *ngIf=\"row.currentData.avatar; else generateIcon\"\n [ngStyle]=\"{'background-image':'url('+row.currentData.avatar+')'}\"></div>\n <ng-template #generateIcon>\n <div class=\"avatar\">\n <svg width=\"38\" width=\"38\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </div>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='lastName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='lastName'\">\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n </td>\n\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n\n (click)=\"focusColumn='firstName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='firstName'\">\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='email'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='email'\">\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{definition.label|translate}}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn=definition.key\">\n <app-form-field floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn===definition.ke\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='profile'\">\n <mat-form-field floatLabel=\"never\">\n <mat-select [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE'|translate\">\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ ('USER.PROFILE_ENUM.' + item) | uppercase |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='status'\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value &gt;=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value &gt;=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='username'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='username'\">\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='usernameExtranet'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='usernameExtranet'\">\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [title]=\"row.validator.controls.pubkey.valueChanges|async\"\n (click)=\"focusColumn='pubkey'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['pubkey']\" [placeholder]=\"'USER.PUBKEY'|translate\"\n [readonly]=\"!row.editing\" autocomplete=\"off\">\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-footer>\n <mat-paginator class=\"mat-paginator-footer\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"!mobile && inlineEdition\"\n (onCancel)=\"onRefresh.emit()\" (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\"></app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n",
25715
26039
  providers: [
25716
26040
  { provide: ValidatorService, useExisting: PersonValidatorService }
25717
26041
  ],
@@ -25722,12 +26046,13 @@ UsersPage.decorators = [
25722
26046
  ];
25723
26047
  UsersPage.ctorParameters = () => [
25724
26048
  { type: Injector },
26049
+ { type: FormBuilder },
25725
26050
  { type: AccountService },
25726
26051
  { type: ValidatorService },
25727
26052
  { type: ConfigService },
25728
26053
  { type: PersonService },
26054
+ { type: MessageService },
25729
26055
  { type: ChangeDetectorRef },
25730
- { type: FormBuilder },
25731
26056
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] }
25732
26057
  ];
25733
26058
  UsersPage.propDecorators = {
@@ -25754,22 +26079,24 @@ AdminModule.decorators = [
25754
26079
  UsersPage
25755
26080
  ],
25756
26081
  exports: [
26082
+ SocialModule,
25757
26083
  UsersPage
25758
26084
  ]
25759
26085
  },] }
25760
26086
  ];
25761
26087
  AdminModule.ctorParameters = () => [];
25762
26088
 
25763
- const ɵ0 = {
26089
+ const ɵ0$c = {
25764
26090
  profile: 'ADMIN'
25765
26091
  };
25766
- const routes$5 = [
26092
+ const routes = [
25767
26093
  {
25768
26094
  path: 'users',
25769
26095
  pathMatch: 'full',
25770
26096
  component: UsersPage,
25771
26097
  canActivate: [AuthGuardService],
25772
- data: ɵ0
26098
+ canDeactivate: [ComponentDirtyGuard],
26099
+ data: ɵ0$c
25773
26100
  }
25774
26101
  ];
25775
26102
  class AdminRoutingModule {
@@ -25779,33 +26106,27 @@ AdminRoutingModule.decorators = [
25779
26106
  imports: [
25780
26107
  SharedRoutingModule,
25781
26108
  AdminModule,
25782
- RouterModule.forChild(routes$5)
26109
+ RouterModule.forChild(routes)
25783
26110
  ],
25784
26111
  exports: [RouterModule]
25785
26112
  },] }
25786
26113
  ];
25787
26114
 
25788
- const ErrorCodes = {
25789
- LOAD_PERSONS_ERROR: 100,
25790
- SAVE_PERSONS_ERROR: 101,
25791
- DELETE_PERSONS_ERROR: 102,
25792
- };
25793
-
25794
- class EntityTestClass$1 {
26115
+ class EntityTestClass {
25795
26116
  }
25796
- const FAKE_ENTITIES$1 = [
26117
+ const FAKE_ENTITIES = [
25797
26118
  { id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments... again for A' },
25798
26119
  { id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments... again for B' },
25799
26120
  { id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments... again for C' }
25800
26121
  ];
25801
- function deepCopy$1(values, size) {
26122
+ function deepCopy(values, size) {
25802
26123
  if (isNil(size)) {
25803
- return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
26124
+ return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
25804
26125
  }
25805
26126
  let result = [];
25806
26127
  let i = 1;
25807
26128
  while (result.length < size) {
25808
- result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
26129
+ result = result.concat((values || FAKE_ENTITIES).map(entity => {
25809
26130
  const name = entity.name + ' #' + i;
25810
26131
  return Object.assign(Object.assign({}, entity), { id: i++, name });
25811
26132
  }));
@@ -25815,7 +26136,7 @@ function deepCopy$1(values, size) {
25815
26136
  class AutocompleteTestPage {
25816
26137
  constructor(formBuilder) {
25817
26138
  this.formBuilder = formBuilder;
25818
- this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
26139
+ this._items = deepCopy(FAKE_ENTITIES, 100);
25819
26140
  this._$items = new BehaviorSubject(undefined);
25820
26141
  this.autocompleteFields = new MatAutocompleteConfigHolder();
25821
26142
  this.memoryHide = false;
@@ -25860,7 +26181,7 @@ class AutocompleteTestPage {
25860
26181
  });
25861
26182
  // From items
25862
26183
  this.autocompleteFields.add('entity-items-large', {
25863
- items: FAKE_ENTITIES$1.slice(),
26184
+ items: FAKE_ENTITIES.slice(),
25864
26185
  attributes: ['label', 'name', 'description', 'comments'],
25865
26186
  displayWith: this.entityToString
25866
26187
  });
@@ -25879,13 +26200,13 @@ class AutocompleteTestPage {
25879
26200
  loadData() {
25880
26201
  return __awaiter(this, void 0, void 0, function* () {
25881
26202
  const data = {
25882
- entity: deepCopy$1(FAKE_ENTITIES$1)[0],
26203
+ entity: deepCopy(FAKE_ENTITIES)[0],
25883
26204
  // This item is NOT in the items list => i should be displayed anyway
25884
26205
  missingEntity: {
25885
26206
  id: -1, label: '??', name: 'Missing item'
25886
26207
  },
25887
- disableEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
25888
- entities: deepCopy$1(FAKE_ENTITIES$1)
26208
+ disableEntity: deepCopy(FAKE_ENTITIES)[2],
26209
+ entities: deepCopy(FAKE_ENTITIES)
25889
26210
  };
25890
26211
  this.form.setValue(data);
25891
26212
  // Load observables
@@ -26032,13 +26353,13 @@ LatLongTestPage.ctorParameters = () => [
26032
26353
  { type: FormBuilder }
26033
26354
  ];
26034
26355
 
26035
- const moment$2 = momentImported;
26356
+ const moment$5 = momentImported;
26036
26357
  class SwipeTestPage {
26037
26358
  constructor(formBuilder, dateFormatPipe) {
26038
26359
  this.formBuilder = formBuilder;
26039
26360
  this.dateFormatPipe = dateFormatPipe;
26040
26361
  this.$dates = new BehaviorSubject(undefined);
26041
- this._today = moment$2().startOf('day');
26362
+ this._today = moment$5().startOf('day');
26042
26363
  this.form = formBuilder.group({
26043
26364
  empty: [null, Validators.required],
26044
26365
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -26051,7 +26372,7 @@ class SwipeTestPage {
26051
26372
  ngOnInit() {
26052
26373
  const dates = [];
26053
26374
  for (let d = 0; d < 7; d++) {
26054
- dates[d] = moment$2(this._today).add(d - 3, 'day');
26375
+ dates[d] = moment$5(this._today).add(d - 3, 'day');
26055
26376
  }
26056
26377
  this.$dates.next(dates);
26057
26378
  this.loadData();
@@ -26092,7 +26413,7 @@ SwipeTestPage.ctorParameters = () => [
26092
26413
  { type: DateFormatPipe }
26093
26414
  ];
26094
26415
 
26095
- const moment$1 = momentImported;
26416
+ const moment$6 = momentImported;
26096
26417
  class DateTimeTestPage {
26097
26418
  constructor(platform, formBuilder, cd) {
26098
26419
  this.platform = platform;
@@ -26123,7 +26444,7 @@ class DateTimeTestPage {
26123
26444
  // Load the form with data
26124
26445
  loadData() {
26125
26446
  return __awaiter(this, void 0, void 0, function* () {
26126
- const now = moment$1();
26447
+ const now = moment$6();
26127
26448
  const data = {
26128
26449
  empty: toDateISOString(now.clone().add(2, 'hours')),
26129
26450
  enable: toDateISOString(now),
@@ -26184,9 +26505,9 @@ DateTimeTestPage.ctorParameters = () => [
26184
26505
  { type: ChangeDetectorRef }
26185
26506
  ];
26186
26507
 
26187
- class EntityTestClass {
26508
+ class EntityTestClass$1 {
26188
26509
  }
26189
- const FAKE_ENTITIES = [
26510
+ const FAKE_ENTITIES$1 = [
26190
26511
  { id: 1, label: 'AAA', name: 'Item A' },
26191
26512
  { id: 2, label: 'BBB', name: 'Item B' },
26192
26513
  { id: 3, label: 'CCC', name: 'Item C' },
@@ -26195,14 +26516,14 @@ const FAKE_ENTITIES = [
26195
26516
  { id: 6, label: 'FFF', name: 'Item F' },
26196
26517
  { id: 7, label: 'GGG', name: 'Item G' }
26197
26518
  ];
26198
- function deepCopy(values, size) {
26519
+ function deepCopy$1(values, size) {
26199
26520
  if (isNil(size)) {
26200
- return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
26521
+ return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
26201
26522
  }
26202
26523
  let result = [];
26203
26524
  let i = 1;
26204
26525
  while (result.length < size) {
26205
- result = result.concat((values || FAKE_ENTITIES).map(entity => {
26526
+ result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
26206
26527
  const name = entity.name + ' #' + i;
26207
26528
  return Object.assign(Object.assign({}, entity), { id: i++, name });
26208
26529
  }));
@@ -26212,7 +26533,7 @@ function deepCopy(values, size) {
26212
26533
  class ChipsTestPage {
26213
26534
  constructor(formBuilder) {
26214
26535
  this.formBuilder = formBuilder;
26215
- this._items = deepCopy(FAKE_ENTITIES, 100);
26536
+ this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
26216
26537
  this._$items = new BehaviorSubject(undefined);
26217
26538
  this.autocompleteFields = new MatAutocompleteConfigHolder();
26218
26539
  this.form = formBuilder.group({
@@ -26251,7 +26572,7 @@ class ChipsTestPage {
26251
26572
  // Load the form with data
26252
26573
  loadData() {
26253
26574
  return __awaiter(this, void 0, void 0, function* () {
26254
- const items = deepCopy(FAKE_ENTITIES);
26575
+ const items = deepCopy$1(FAKE_ENTITIES$1);
26255
26576
  const data = {
26256
26577
  entity: items.slice(0, 1),
26257
26578
  entityInitial: items.slice(1, 2),
@@ -26367,7 +26688,7 @@ NumpadTestPage.ctorParameters = () => [
26367
26688
  { type: FormBuilder }
26368
26689
  ];
26369
26690
 
26370
- const moment = momentImported;
26691
+ const moment$7 = momentImported;
26371
26692
  class DateTestPage {
26372
26693
  constructor(formBuilder, cd) {
26373
26694
  this.formBuilder = formBuilder;
@@ -26379,7 +26700,8 @@ class DateTestPage {
26379
26700
  this.timezone = 'Indian/Mahe';
26380
26701
  this.stringify = JSON.stringify;
26381
26702
  this.form = formBuilder.group({
26382
- empty: [null, Validators.required],
26703
+ empty: [null, SharedValidators.validDate],
26704
+ emptyRequired: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
26383
26705
  enable: [null, Validators.required],
26384
26706
  disable: [null, Validators.required],
26385
26707
  readonly: [null],
@@ -26399,10 +26721,11 @@ class DateTestPage {
26399
26721
  // Load the form with data
26400
26722
  loadData() {
26401
26723
  return __awaiter(this, void 0, void 0, function* () {
26402
- const now = moment();
26724
+ const now = moment$7();
26403
26725
  const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
26404
26726
  const data = {
26405
- empty: toDateISOString(now.clone().add(2, 'hours')),
26727
+ empty: null,
26728
+ emptyRequired: null,
26406
26729
  enable: toDateISOString(now),
26407
26730
  disable: now.clone(),
26408
26731
  readonly: now.clone(),
@@ -26456,7 +26779,7 @@ class DateTestPage {
26456
26779
  DateTestPage.decorators = [
26457
26780
  { type: Component, args: [{
26458
26781
  selector: 'app-data-test',
26459
- template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Date field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <ion-grid>\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\">Start timer</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n </ion-col>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"never\">\n <input matInput type=\"text\" hidden>\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [value]=\"memoryMobile\">\n Mobile ?\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n <ion-col>\n <mat-date-field formControlName=\"empty\"\n *ngIf=\"!memoryHide\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"memoryMobile\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-col>\n </ion-row>\n\n <!-- Mobile mode -->\n <ion-row><ion-col><ion-text><h4>Mobile mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value=\"{{stringify(form.controls.timezone.value)}}\"</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field #readonlyField formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"true\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n <!-- debug console -->\n <ion-row>\n <!-- buttons -->\n <ion-col size=\"2\">\n <!-- submit form -->\n <ion-button (click)=\"doSubmit($event)\"\n fill=\"outline\">\n <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n <!-- clear log -->\n <ion-button (click)=\"clearLogPanel()\"\n fill=\"outline\">\n <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col size=\"10\" *ngIf=\"showLogPanel\">\n <ion-text color=\"primary\">Log:<br/></ion-text>\n <div class=\"ion-padding-start\">\n <ion-text color=\"medium\">\n <small [innerHTML]=\"logContent\"></small>\n </ion-text>\n </div>\n </ion-col>\n </ion-row>\n\n <hr/>\n\n <!-- Desktop mode -->\n <ion-row><ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value={{stringify(form.controls.timezone.value)}}</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field #readonlyField formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"false\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly toggle\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.readonly.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n </mat-checkbox>\n\n <mat-date-field #readonlyField formControlName=\"readonly\"\n placeholder=\"Date\"\n [readonly]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n </ion-grid>\n </form>\n\n</ion-content>\n"
26782
+ template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Date field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n\n <ion-grid>\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\">Start timer</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n </ion-col>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"never\">\n <input matInput type=\"text\" hidden>\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [value]=\"memoryMobile\">\n Mobile ?\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n <ion-col>\n <mat-date-field formControlName=\"empty\"\n *ngIf=\"!memoryHide\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"memoryMobile\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-col>\n </ion-row>\n\n <!-- Mobile mode -->\n <ion-row><ion-col><ion-text><h4>Mobile mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value (required)\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.emptyRequired.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"emptyRequired\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value=\"{{stringify(form.controls.timezone.value)}}\"</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"true\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly toggle\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.readonly.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"mobileReadonlyField.readonly=$event.checked\" [checked]=\"mobileReadonlyField.readonly\">\n </mat-checkbox>\n\n <mat-date-field #mobileReadonlyField formControlName=\"readonly\"\n placeholder=\"Date\"\n [readonly]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n <!-- debug console -->\n <ion-row>\n <!-- buttons -->\n <ion-col size=\"2\">\n <!-- submit form -->\n <ion-button (click)=\"doSubmit($event)\"\n fill=\"outline\">\n <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n <!-- clear log -->\n <ion-button (click)=\"clearLogPanel()\"\n fill=\"outline\">\n <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col size=\"10\" *ngIf=\"showLogPanel\">\n <ion-text color=\"primary\">Log:<br/></ion-text>\n <div class=\"ion-padding-start\">\n <ion-text color=\"medium\">\n <small [innerHTML]=\"logContent\"></small>\n </ion-text>\n </div>\n </ion-col>\n </ion-row>\n\n <hr/>\n\n <!-- Desktop mode -->\n <ion-row><ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value (required)\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.emptyRequired.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"emptyRequired\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value={{stringify(form.controls.timezone.value)}}</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"false\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly toggle\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.readonly.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"desktopReadonlyField.readonly=$event.checked\" [checked]=\"desktopReadonlyField.readonly\">\n </mat-checkbox>\n\n <mat-date-field #desktopReadonlyField formControlName=\"readonly\"\n placeholder=\"Date\"\n [readonly]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n </ion-grid>\n\n </form>\n</ion-content>\n"
26460
26783
  },] }
26461
26784
  ];
26462
26785
  DateTestPage.ctorParameters = () => [
@@ -26476,7 +26799,7 @@ const SHARED_MATERIAL_TESTING_PAGES = [
26476
26799
  { label: 'Shared directives', divider: true },
26477
26800
  { label: 'Badge icon directive', page: '/testing/shared/badge-icon' }
26478
26801
  ];
26479
- const routes$4 = [
26802
+ const routes$1 = [
26480
26803
  {
26481
26804
  path: '',
26482
26805
  pathMatch: 'full',
@@ -26533,7 +26856,7 @@ MaterialTestingModule.decorators = [
26533
26856
  ReactiveFormsModule,
26534
26857
  SharedMaterialModule,
26535
26858
  TranslateModule.forChild(),
26536
- RouterModule.forChild(routes$4)
26859
+ RouterModule.forChild(routes$1)
26537
26860
  ],
26538
26861
  declarations: [
26539
26862
  DateTimeTestPage,
@@ -26594,7 +26917,7 @@ ToastTestingPage.ctorParameters = () => [
26594
26917
  { type: TranslateService }
26595
26918
  ];
26596
26919
 
26597
- const routes$3 = [
26920
+ const routes$2 = [
26598
26921
  {
26599
26922
  path: 'toast',
26600
26923
  pathMatch: 'full',
@@ -26609,7 +26932,7 @@ ToastTestingModule.decorators = [
26609
26932
  CommonModule,
26610
26933
  IonicModule,
26611
26934
  TranslateModule.forChild(),
26612
- RouterModule.forChild(routes$3)
26935
+ RouterModule.forChild(routes$2)
26613
26936
  ],
26614
26937
  declarations: [
26615
26938
  ToastTestingPage
@@ -26672,7 +26995,7 @@ UploadFileTestingPage.ctorParameters = () => [
26672
26995
  { type: PopoverController }
26673
26996
  ];
26674
26997
 
26675
- const routes$2 = [
26998
+ const routes$3 = [
26676
26999
  {
26677
27000
  path: 'upload-file',
26678
27001
  pathMatch: 'full',
@@ -26687,7 +27010,7 @@ UploadFileTestingModule.decorators = [
26687
27010
  CommonModule,
26688
27011
  IonicModule,
26689
27012
  TranslateModule.forChild(),
26690
- RouterModule.forChild(routes$2)
27013
+ RouterModule.forChild(routes$3)
26691
27014
  ],
26692
27015
  declarations: [
26693
27016
  UploadFileTestingPage
@@ -27068,7 +27391,7 @@ TextPopoverTestingPage.ctorParameters = () => [
27068
27391
  { type: PopoverController }
27069
27392
  ];
27070
27393
 
27071
- const routes$1 = [
27394
+ const routes$4 = [
27072
27395
  {
27073
27396
  path: 'text-popover',
27074
27397
  pathMatch: 'full',
@@ -27083,7 +27406,7 @@ TextPopoverTestingModule.decorators = [
27083
27406
  CommonModule,
27084
27407
  IonicModule,
27085
27408
  TranslateModule.forChild(),
27086
- RouterModule.forChild(routes$1)
27409
+ RouterModule.forChild(routes$4)
27087
27410
  ],
27088
27411
  declarations: [
27089
27412
  TextPopoverTestingPage
@@ -27100,7 +27423,7 @@ const CORE_TESTING_PAGES = [
27100
27423
  { label: 'Table', page: '/testing/core/table' },
27101
27424
  { label: 'Text popover', page: '/testing/core/text-popover' }
27102
27425
  ];
27103
- const routes = [
27426
+ const routes$5 = [
27104
27427
  {
27105
27428
  path: '',
27106
27429
  pathMatch: 'full',
@@ -27124,7 +27447,7 @@ CoreTestingModule.decorators = [
27124
27447
  imports: [
27125
27448
  CommonModule,
27126
27449
  TranslateModule.forChild(),
27127
- RouterModule.forChild(routes),
27450
+ RouterModule.forChild(routes$5),
27128
27451
  // Sub modules
27129
27452
  TableTestingModule,
27130
27453
  TextPopoverTestingModule
@@ -27144,5 +27467,5 @@ CoreTestingModule.decorators = [
27144
27467
  * Generated bundle index. Do not edit.
27145
27468
  */
27146
27469
 
27147
- export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, 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, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0$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, AppIconComponent as ɵi, DateTestPage as ɵj, NumpadTestPage as ɵk, MatBadgeIconTestPage as ɵl, ToastTestingModule as ɵm, ToastTestingPage as ɵn };
27470
+ export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, Fragments$1 as Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageService, MessageTypeList, MessageTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialErrorCodes, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventFragments, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, 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, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppIconComponent as ɵi, DateTestPage as ɵj, NumpadTestPage as ɵk, MatBadgeIconTestPage as ɵl, ToastTestingModule as ɵm, ToastTestingPage as ɵn };
27148
27471
  //# sourceMappingURL=sumaris-net.ngx-components.js.map