@sumaris-net/ngx-components 2.0.0-rc11 → 2.0.0-rc13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/esm2020/src/app/core/services/account.service.mjs +18 -19
  2. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +5 -5
  3. package/esm2020/src/app/core/services/base58.mjs +2 -2
  4. package/esm2020/src/app/core/services/crypto.service.mjs +79 -94
  5. package/esm2020/src/app/core/services/local-settings.service.mjs +2 -3
  6. package/esm2020/src/app/core/services/model/peer.model.mjs +3 -3
  7. package/esm2020/src/app/core/services/platform.service.mjs +2 -3
  8. package/esm2020/src/app/core/table/table.class.mjs +4 -12
  9. package/esm2020/src/app/shared/dates.mjs +2 -3
  10. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +2 -3
  11. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +2 -3
  12. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +2 -3
  13. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +2 -3
  14. package/esm2020/src/app/shared/validator/validators.mjs +2 -3
  15. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +2 -3
  16. package/esm2020/src/app/social/user-event/user-event.service.mjs +2 -3
  17. package/esm2020/src/app/vendor.mjs +3 -5
  18. package/fesm2015/sumaris-net.ngx-components.mjs +132 -161
  19. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
  20. package/fesm2020/sumaris-net.ngx-components.mjs +127 -164
  21. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
  22. package/package.json +2 -1
  23. package/src/app/core/services/account.service.d.ts +5 -6
  24. package/src/app/core/services/base-graphql-service.class.d.ts +9 -8
  25. package/src/app/core/services/crypto.service.d.ts +23 -18
  26. package/src/app/core/table/table.class.d.ts +2 -6
  27. package/src/app/shared/dates.d.ts +2 -3
  28. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +1 -2
  29. package/src/app/vendor.d.ts +0 -2
@@ -69,14 +69,12 @@ import * as momentImported from 'moment';
69
69
  import { isMoment } from 'moment';
70
70
  import * as i1 from '@angular/material-moment-adapter';
71
71
  import { MatMomentDateModule } from '@angular/material-moment-adapter';
72
- import * as i11$1 from 'angular2-text-mask';
73
- import { TextMaskModule } from 'angular2-text-mask';
74
- import { sign, box, hash, verify } from 'tweetnacl';
75
- import 'tweetnacl-util';
76
- import 'scrypt-async';
72
+ import { decodeUTF8, encodeBase64, decodeBase64 } from 'tweetnacl-util';
77
73
  import 'hammerjs';
78
74
  import * as momentTZImported from 'moment-timezone';
79
75
  import * as uuidv4Imported from 'uuid/v4';
76
+ import * as i11$1 from 'angular2-text-mask';
77
+ import { TextMaskModule } from 'angular2-text-mask';
80
78
  import * as i10 from '@angular/material/datepicker';
81
79
  import { MatDatepickerModule } from '@angular/material/datepicker';
82
80
  import * as i12 from 'ngx-material-timepicker';
@@ -114,6 +112,12 @@ import * as i3 from '@ionic/storage-angular';
114
112
  import { IonicStorageModule } from '@ionic/storage-angular';
115
113
  import * as i7$2 from '@awesome-cordova-plugins/network/ngx';
116
114
  import { Connection } from '@awesome-cordova-plugins/network/ngx';
115
+ import { scryptEncode } from '@polkadot/util-crypto/scrypt/encode';
116
+ import { cryptoWaitReady, ed25519PairFromSeed, ed25519Sign, ed25519Verify } from '@polkadot/util-crypto';
117
+ import { sha512 } from '@noble/hashes/sha512';
118
+ import { sha256 } from '@noble/hashes/sha256';
119
+ import { utils } from '@noble/ed25519';
120
+ import { bytesToHex } from '@noble/hashes/utils';
117
121
  import * as i5$1 from 'ionic-cache';
118
122
  import { CacheModule } from 'ionic-cache';
119
123
  import { ApolloLink, NetworkStatus, InMemoryCache, ApolloClient, gql } from '@apollo/client/core';
@@ -2527,7 +2531,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
2527
2531
  type: Input
2528
2532
  }] } });
2529
2533
 
2530
- const moment$a = momentImported;
2534
+ const moment = momentImported;
2535
+ const tz = momentTZImported;
2536
+ const uuidv4 = uuidv4Imported;
2537
+
2531
2538
  class DateDiffDurationPipe {
2532
2539
  constructor(dateAdapter, translate) {
2533
2540
  this.dateAdapter = dateAdapter;
@@ -2543,11 +2550,11 @@ class DateDiffDurationPipe {
2543
2550
  return this.format(startDate, endDate, args);
2544
2551
  }
2545
2552
  format(startDate, endDate, args) {
2546
- const duration = moment$a.duration(endDate.diff(startDate));
2553
+ const duration = moment.duration(endDate.diff(startDate));
2547
2554
  if (duration.asMinutes() < 0)
2548
2555
  return '';
2549
2556
  const withSeconds = args?.seconds;
2550
- const timeDuration = moment$a(0)
2557
+ const timeDuration = moment(0)
2551
2558
  .hour(duration.hours())
2552
2559
  .minute(duration.minutes());
2553
2560
  if (withSeconds) {
@@ -2988,7 +2995,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
2988
2995
  args: [{ name: 'fileSize' }]
2989
2996
  }] });
2990
2997
 
2991
- const moment$9 = momentImported;
2992
2998
  const DATE_UNIX_TIMESTAMP = 'X';
2993
2999
  const DATE_UNIX_MS_TIMESTAMP = 'x';
2994
3000
  const MOMENT_NO_TIME_PROPERTY = '_hasNoTime';
@@ -3077,37 +3083,37 @@ function fromDateISOString(value) {
3077
3083
  return value;
3078
3084
  if (typeof value === 'string' && value.length === 10) {
3079
3085
  // Parse the input value, as a date only
3080
- const dateOnly = moment$9(value, DATE_PATTERN);
3086
+ const dateOnly = moment(value, DATE_PATTERN);
3081
3087
  if (dateOnly.isValid())
3082
3088
  return DateUtils.markNoTime(dateOnly);
3083
3089
  }
3084
3090
  // Parse the input value, as a ISO date time
3085
- const date = moment$9(value, DATE_ISO_PATTERN);
3091
+ const date = moment(value, DATE_ISO_PATTERN);
3086
3092
  if (date.isValid())
3087
3093
  return date;
3088
3094
  // Not valid: trying to convert from unix timestamp
3089
3095
  if (typeof value === 'string') {
3090
3096
  console.warn('Wrong date format - Trying to convert from local time: ' + value);
3091
3097
  if (value.length === 10) {
3092
- return moment$9(value, DATE_UNIX_TIMESTAMP);
3098
+ return moment(value, DATE_UNIX_TIMESTAMP);
3093
3099
  }
3094
3100
  else if (value.length === 13) {
3095
- return moment$9(value, DATE_UNIX_MS_TIMESTAMP);
3101
+ return moment(value, DATE_UNIX_MS_TIMESTAMP);
3096
3102
  }
3097
3103
  }
3098
3104
  console.warn('Unable to parse date: ' + value);
3099
3105
  return undefined;
3100
3106
  }
3101
3107
  function fromUnixTimestamp(timeInSec) {
3102
- return moment$9(timeInSec, DATE_UNIX_TIMESTAMP);
3108
+ return moment(timeInSec, DATE_UNIX_TIMESTAMP);
3103
3109
  }
3104
3110
  function fromUnixMsTimestamp(timeInMs) {
3105
- return moment$9(timeInMs, DATE_UNIX_MS_TIMESTAMP);
3111
+ return moment(timeInMs, DATE_UNIX_MS_TIMESTAMP);
3106
3112
  }
3107
3113
  function toDuration(value, unit) {
3108
3114
  if (!value)
3109
3115
  return undefined;
3110
- const duration = moment$9.duration(value, unit);
3116
+ const duration = moment.duration(value, unit);
3111
3117
  // fix 990+ ms
3112
3118
  if (duration.milliseconds() >= 990) {
3113
3119
  duration.add(1000 - duration.milliseconds(), 'ms');
@@ -3382,7 +3388,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
3382
3388
  type: Injectable
3383
3389
  }] });
3384
3390
 
3385
- const moment$8 = momentImported;
3386
3391
  // @dynamic
3387
3392
  class SharedValidators {
3388
3393
  static getDoubleRegexp(maxDecimals) {
@@ -3463,7 +3468,7 @@ class SharedValidators {
3463
3468
  }
3464
3469
  static validDate(control) {
3465
3470
  const value = control.value;
3466
- const date = !value || moment$8.isMoment(value) ? value : moment$8(value, DATE_ISO_PATTERN);
3471
+ const date = !value || moment.isMoment(value) ? value : moment(value, DATE_ISO_PATTERN);
3467
3472
  if (date && (!date.isValid() || date.year() < 1970)) {
3468
3473
  return { validDate: true };
3469
3474
  }
@@ -5720,10 +5725,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
5720
5725
  }]
5721
5726
  }] });
5722
5727
 
5723
- const moment$7 = momentImported;
5724
- const tz = momentTZImported;
5725
- const uuidv4 = uuidv4Imported;
5726
-
5727
5728
  const DEFAULT_VALUE_ACCESSOR$5 = {
5728
5729
  provide: NG_VALUE_ACCESSOR,
5729
5730
  useExisting: forwardRef(() => MatDate),
@@ -5905,7 +5906,7 @@ class MatDate {
5905
5906
  // No value, but mobile mode: use the current date
5906
5907
  if (!value && this.mobile) {
5907
5908
  this._writing = true;
5908
- value = DateUtils.resetTime(moment$7().locale(this.locale), this.timezone);
5909
+ value = DateUtils.resetTime(moment().locale(this.locale), this.timezone);
5909
5910
  this.formControl.setValue(value, { emitEvent: false });
5910
5911
  this.markForCheck();
5911
5912
  this._writing = false;
@@ -6277,7 +6278,7 @@ class MatDateTime {
6277
6278
  // No value, but mobile mode: use the current date
6278
6279
  if (!value && this.mobile) {
6279
6280
  this._writing = true;
6280
- value = DateUtils.resetTime(moment$7().locale(this.locale));
6281
+ value = DateUtils.resetTime(moment().locale(this.locale));
6281
6282
  this.formControl.setValue(value, { emitEvent: false });
6282
6283
  this.markForCheck();
6283
6284
  this._writing = false;
@@ -12949,7 +12950,7 @@ let Peer = Peer_1 = class Peer extends Entity {
12949
12950
  }
12950
12951
  static parseUrl(peerUrl) {
12951
12952
  const url = new URL(peerUrl);
12952
- return Peer_1.fromObject({
12953
+ return this.fromObject({
12953
12954
  dns: url.hostname,
12954
12955
  port: isNilOrBlank(url.port) ? undefined : url.port,
12955
12956
  useSsl: url.protocol && (url.protocol.startsWith('https') || url.protocol.startsWith('wss')),
@@ -12967,7 +12968,7 @@ let Peer = Peer_1 = class Peer extends Entity {
12967
12968
  return path.substring(1);
12968
12969
  return path;
12969
12970
  }).filter(isNotNilOrBlank);
12970
- return [noTrailingSlash(Peer_1.fromObject(peer).url)].concat(...paths).join('/');
12971
+ return [noTrailingSlash(this.fromObject(peer).url)].concat(...paths).join('/');
12971
12972
  }
12972
12973
  asObject(options) {
12973
12974
  return super.asObject(options);
@@ -13003,7 +13004,6 @@ Peer = Peer_1 = __decorate([
13003
13004
  EntityClass({ typename: 'PeerVO' })
13004
13005
  ], Peer);
13005
13006
 
13006
- const moment$6 = momentImported;
13007
13007
  const SETTINGS_STORAGE_KEY = 'settings';
13008
13008
  const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
13009
13009
  // fixme: this constant points to static environment
@@ -13231,11 +13231,11 @@ class LocalSettingsService extends StartableService {
13231
13231
  if (!feature) {
13232
13232
  feature = {
13233
13233
  name: featureName.toLowerCase(),
13234
- lastSyncDate: moment$6().toISOString()
13234
+ lastSyncDate: moment().toISOString()
13235
13235
  };
13236
13236
  }
13237
13237
  else {
13238
- feature.lastSyncDate = moment$6().toISOString();
13238
+ feature.lastSyncDate = moment().toISOString();
13239
13239
  }
13240
13240
  this.saveOfflineFeature(feature);
13241
13241
  }
@@ -13390,7 +13390,7 @@ class LocalSettingsService extends StartableService {
13390
13390
  if (!page || !page.title || !page.path)
13391
13391
  throw Error('Missing required argument \'page\', \'page.path\' or \'page.title\'');
13392
13392
  // Set time
13393
- page.time = page.time || moment$6();
13393
+ page.time = page.time || moment();
13394
13394
  // Clean the title (remove <small> tags)
13395
13395
  if (!opts || opts.removeTitleSmallTag !== false) {
13396
13396
  const tagIndex = page.title.indexOf('</small>');
@@ -13771,7 +13771,7 @@ class Base58 {
13771
13771
  }
13772
13772
  static decode(string) {
13773
13773
  if (string.length === 0)
13774
- return (new Uint8Array());
13774
+ return (new Uint8Array(0));
13775
13775
  const input = string.split('').map(function (c) {
13776
13776
  return Base58.getAlphabetMap()[c];
13777
13777
  });
@@ -13802,124 +13802,103 @@ class Base58 {
13802
13802
  }
13803
13803
  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
13804
13804
 
13805
- const scrypt = require('scrypt-async');
13806
- const sha256$1 = require('hash.js/lib/hash/sha/256');
13807
- const sha512 = require('hash.js/lib/hash/sha/512');
13808
- const nacl = {
13809
- sign,
13810
- box,
13811
- hash,
13812
- verify,
13813
- util: require('tweetnacl-util'),
13814
- constants: {
13815
- crypto_sign_BYTES: 64,
13816
- SEED_LENGTH: 32,
13817
- SCRYPT_PARAMS: {
13818
- SIMPLE: {
13819
- N: 2048,
13820
- r: 8,
13821
- p: 1,
13822
- memory: -1 // default
13823
- },
13824
- DEFAULT: {
13825
- N: 4096,
13826
- r: 16,
13827
- p: 1,
13828
- memory: -1 // default
13829
- },
13830
- SECURE: {
13831
- N: 16384,
13832
- r: 32,
13833
- p: 2,
13834
- memory: -1 // default
13835
- },
13836
- HARDEST: {
13837
- N: 65536,
13838
- r: 32,
13839
- p: 4,
13840
- memory: -1 // default
13841
- },
13842
- EXTREME: {
13843
- N: 262144,
13844
- r: 64,
13845
- p: 8,
13846
- memory: -1 // default
13847
- }
13848
- }
13805
+ const ED25519_SEED_LENGTH = 32; // Length of a ED25519 seed
13806
+ const SCRYPT_PARAMS = {
13807
+ SIMPLE: {
13808
+ N: 2048,
13809
+ r: 8,
13810
+ p: 1
13811
+ },
13812
+ DEFAULT: {
13813
+ N: 4096,
13814
+ r: 16,
13815
+ p: 1
13816
+ },
13817
+ SECURE: {
13818
+ N: 16384,
13819
+ r: 32,
13820
+ p: 2
13821
+ },
13822
+ HARDEST: {
13823
+ N: 65536,
13824
+ r: 32,
13825
+ p: 4
13826
+ },
13827
+ EXTREME: {
13828
+ N: 262144,
13829
+ r: 64,
13830
+ p: 8
13849
13831
  }
13850
13832
  };
13851
13833
  class CryptoService {
13834
+ static get started() {
13835
+ return this._ready;
13836
+ }
13837
+ static async ready() {
13838
+ if (this._ready)
13839
+ return; // OK
13840
+ await cryptoWaitReady();
13841
+ this._ready = true;
13842
+ }
13852
13843
  /**
13853
- * Generate sign keypair, sugin scrypt, from a salt and a password
13844
+ * Generate a sign keypair, using scrypt, from a salt and a password
13854
13845
  *
13855
13846
  * @param salt
13856
13847
  * @param password
13857
13848
  * @param scryptParams
13858
13849
  */
13859
- scryptKeypair(salt, password, scryptParams) {
13860
- return new Promise((resolve) => {
13861
- scrypt(password, salt, {
13862
- N: scryptParams && scryptParams.N || nacl.constants.SCRYPT_PARAMS.DEFAULT.N,
13863
- r: scryptParams && scryptParams.r || nacl.constants.SCRYPT_PARAMS.DEFAULT.r,
13864
- p: scryptParams && scryptParams.p || nacl.constants.SCRYPT_PARAMS.DEFAULT.p,
13865
- dkLen: nacl.constants.SEED_LENGTH,
13866
- encoding: 'base64'
13867
- }, function (derivedKey) {
13868
- resolve(derivedKey);
13869
- });
13870
- })
13871
- .then((seed) => {
13872
- const byteseed = nacl.util.decodeBase64(seed);
13873
- const signKeypair = nacl.sign.keyPair.fromSeed(byteseed);
13874
- return {
13875
- publicKey: signKeypair.publicKey,
13876
- secretKey: signKeypair.secretKey
13877
- };
13878
- });
13850
+ static async scryptKeypair(salt, password, scryptParams) {
13851
+ if (!this.started)
13852
+ await this.ready();
13853
+ const passwordU8a = decodeUTF8(password);
13854
+ const saltU8a = decodeUTF8(salt);
13855
+ const result = scryptEncode(passwordU8a, saltU8a, scryptParams || SCRYPT_PARAMS.DEFAULT);
13856
+ const seed = result.password.slice(0, ED25519_SEED_LENGTH);
13857
+ return ed25519PairFromSeed(seed);
13879
13858
  }
13880
13859
  /**
13881
13860
  * Sign a message, from a key pair
13882
13861
  */
13883
- sign(message, keypair) {
13884
- return new Promise((resolve) => {
13885
- const m = nacl.util.decodeUTF8(message);
13886
- const signedMsg = nacl.sign(m, keypair.secretKey);
13887
- const sig = new Uint8Array(nacl.constants.crypto_sign_BYTES);
13888
- for (let i = 0; i < sig.length; i++)
13889
- sig[i] = signedMsg[i];
13890
- const signature = nacl.util.encodeBase64(sig);
13891
- resolve(signature);
13892
- });
13862
+ static async sign(message, keypair) {
13863
+ if (!this.started)
13864
+ await this.ready();
13865
+ const m = decodeUTF8(message);
13866
+ const sig = ed25519Sign(m, keypair);
13867
+ return encodeBase64(sig);
13893
13868
  }
13894
13869
  /**
13895
13870
  * Sign a message, from a key pair
13896
13871
  */
13897
- verify(message, signature, pubkey) {
13898
- return new Promise((resolve) => {
13899
- const m = nacl.util.decodeUTF8(message);
13900
- const sig = nacl.util.decodeBase64(signature);
13901
- const pub = Base58.decode(pubkey);
13902
- const res = nacl.sign.detached.verify(m, sig, pub);
13903
- resolve(res);
13904
- });
13872
+ static async verify(message, signature, publicKey) {
13873
+ if (!this.started)
13874
+ await this.ready();
13875
+ const m = decodeUTF8(message);
13876
+ const sig = decodeBase64(signature);
13877
+ const pub = Base58.decode(publicKey);
13878
+ return ed25519Verify(m, sig, pub);
13905
13879
  }
13906
13880
  /**
13907
- * Hash (using SHA256) a message
13881
+ * Hash (using SHA256) a message, as Hex
13908
13882
  */
13909
- sha256(message) {
13910
- return sha256$1().update(message).digest('hex');
13883
+ static sha256(message) {
13884
+ const m = decodeUTF8(message);
13885
+ const bytes = sha256(utils.concatBytes(m));
13886
+ return bytesToHex(bytes);
13911
13887
  }
13912
13888
  /**
13913
- * Hash (using SHA512) a message
13889
+ * Hash (using SHA512) a message, as Hex
13914
13890
  */
13915
- sha512(message) {
13916
- return sha512().update(message).digest('hex');
13891
+ static sha512(message) {
13892
+ const m = decodeUTF8(message);
13893
+ const bytes = sha512(utils.concatBytes(m));
13894
+ return bytesToHex(bytes);
13917
13895
  }
13918
- encodeBase64(message) {
13919
- const m = nacl.util.decodeUTF8(message);
13920
- return nacl.util.encodeBase64(m);
13896
+ static encodeBase64(message) {
13897
+ const m = decodeUTF8(message);
13898
+ return encodeBase64(m);
13921
13899
  }
13922
13900
  }
13901
+ CryptoService._ready = false;
13923
13902
  CryptoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: CryptoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
13924
13903
  CryptoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: CryptoService, providedIn: 'root' });
13925
13904
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: CryptoService, decorators: [{
@@ -15616,7 +15595,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
15616
15595
  args: [APP_GRAPHQL_TYPE_POLICIES]
15617
15596
  }] }]; } });
15618
15597
 
15619
- const sha256 = require('hash.js/lib/hash/sha/256');
15620
15598
  class BaseGraphqlServiceOptions {
15621
15599
  }
15622
15600
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
@@ -15689,7 +15667,7 @@ class BaseGraphqlService extends StartableService {
15689
15667
  queries.forEach(query => {
15690
15668
  if (Array.isArray(opts.data)) {
15691
15669
  // Filter values, if a filter function exists
15692
- const data = query.insertFilterFn ? opts.data.filter(i => query.insertFilterFn(i)) : opts.data;
15670
+ const data = query.insertFilterFn ? opts.data.filter(d => query.insertFilterFn(d)) : opts.data;
15693
15671
  if (isNotEmptyArray(data)) {
15694
15672
  if (this._debug)
15695
15673
  console.debug(`[base-data-service] Inserting data into watching query: `, query.id);
@@ -15765,8 +15743,8 @@ class BaseGraphqlService extends StartableService {
15765
15743
  }
15766
15744
  /* -- protected methods -- */
15767
15745
  computeMutableWatchQueryId(opts) {
15768
- const queryName = opts.queryName || sha256().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
15769
- const variablesKey = opts.variables && sha256().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
15746
+ const queryName = opts.queryName || CryptoService.sha256(JSON.stringify(opts.query)).substring(0, 8);
15747
+ const variablesKey = opts.variables && CryptoService.sha256(JSON.stringify(opts.variables)).substring(0, 8) || '';
15770
15748
  return [queryName, opts.arrayFieldName, variablesKey].join('|');
15771
15749
  }
15772
15750
  findMutableWatchQueries(opts) {
@@ -15946,9 +15924,8 @@ const AccountSubscriptions = {
15946
15924
  }`
15947
15925
  };
15948
15926
  class AccountService extends BaseGraphqlService {
15949
- constructor(cryptoService, network, graphql, settings, storage, file, translate, toastController, environment) {
15927
+ constructor(network, graphql, settings, storage, file, translate, toastController, environment) {
15950
15928
  super(graphql, environment);
15951
- this.cryptoService = cryptoService;
15952
15929
  this.network = network;
15953
15930
  this.graphql = graphql;
15954
15931
  this.settings = settings;
@@ -16134,7 +16111,7 @@ class AccountService extends BaseGraphqlService {
16134
16111
  this._cache.loaded = false;
16135
16112
  const now = Date.now();
16136
16113
  try {
16137
- const keypair = await this.cryptoService.scryptKeypair(data.username, data.password);
16114
+ const keypair = await CryptoService.scryptKeypair(data.username, data.password);
16138
16115
  data.account.pubkey = Base58.encode(keypair.publicKey);
16139
16116
  // Default values
16140
16117
  data.account.settings = data.account.settings || new UserSettings();
@@ -16179,7 +16156,7 @@ class AccountService extends BaseGraphqlService {
16179
16156
  if (!(this._cache.authToken && tokenType === 'basic-and-token')) {
16180
16157
  if (!data || !data.username || !data.password)
16181
16158
  throw new Error('Missing username and password');
16182
- this._cache.authBasic = this.cryptoService.encodeBase64(`${data.username}:${data.password}`);
16159
+ this._cache.authBasic = CryptoService.encodeBase64(`${data.username}:${data.password}`);
16183
16160
  }
16184
16161
  }
16185
16162
  this.onAuthBasicChange.next(this._cache.authBasic);
@@ -16208,7 +16185,7 @@ class AccountService extends BaseGraphqlService {
16208
16185
  console.debug('[account] Login...');
16209
16186
  let keypair;
16210
16187
  try {
16211
- keypair = await this.cryptoService.scryptKeypair(data.username, data.password);
16188
+ keypair = await CryptoService.scryptKeypair(data.username, data.password);
16212
16189
  }
16213
16190
  catch (error) {
16214
16191
  console.error(error);
@@ -16809,13 +16786,13 @@ class AccountService extends BaseGraphqlService {
16809
16786
  if (!data || !data.authChallenge)
16810
16787
  throw challengeError; // Should never occur
16811
16788
  // Check server signature
16812
- const signatureOK = await this.cryptoService.verify(data.authChallenge.challenge, data.authChallenge.signature, data.authChallenge.pubkey);
16789
+ const signatureOK = await CryptoService.verify(data.authChallenge.challenge, data.authChallenge.signature, data.authChallenge.pubkey);
16813
16790
  if (!signatureOK) {
16814
16791
  console.warn('FIXME: Bad peer signature on auth challenge !', data.authChallenge);
16815
16792
  }
16816
16793
  // TODO: check server pubkey as a valid certificate
16817
16794
  // Do the challenge
16818
- const signature = await this.cryptoService.sign(data.authChallenge.challenge, this._cache.keypair);
16795
+ const signature = await CryptoService.sign(data.authChallenge.challenge, this._cache.keypair);
16819
16796
  const newToken = `${this._cache.pubkey}:${data.authChallenge.challenge}|${signature}`;
16820
16797
  // iterate with the new token
16821
16798
  return await this.authenticateAndGetToken(newToken, (counter || 1) + 1 /* increment */);
@@ -16900,12 +16877,12 @@ class AccountService extends BaseGraphqlService {
16900
16877
  return Toasts.show(this.toastController, this.translate, opts);
16901
16878
  }
16902
16879
  }
16903
- AccountService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AccountService, deps: [{ token: CryptoService }, { token: NetworkService }, { token: GraphqlService }, { token: LocalSettingsService }, { token: i3.Storage }, { token: FileService }, { token: i1$1.TranslateService, optional: true }, { token: i2.ToastController, optional: true }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Injectable });
16880
+ AccountService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AccountService, deps: [{ token: NetworkService }, { token: GraphqlService }, { token: LocalSettingsService }, { token: i3.Storage }, { token: FileService }, { token: i1$1.TranslateService, optional: true }, { token: i2.ToastController, optional: true }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Injectable });
16904
16881
  AccountService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AccountService, providedIn: 'root' });
16905
16882
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AccountService, decorators: [{
16906
16883
  type: Injectable,
16907
16884
  args: [{ providedIn: 'root', deps: [ENVIRONMENT] }]
16908
- }], ctorParameters: function () { return [{ type: CryptoService }, { type: NetworkService }, { type: GraphqlService }, { type: LocalSettingsService }, { type: i3.Storage }, { type: FileService }, { type: i1$1.TranslateService, decorators: [{
16885
+ }], ctorParameters: function () { return [{ type: NetworkService }, { type: GraphqlService }, { type: LocalSettingsService }, { type: i3.Storage }, { type: FileService }, { type: i1$1.TranslateService, decorators: [{
16909
16886
  type: Optional
16910
16887
  }] }, { type: i2.ToastController, decorators: [{
16911
16888
  type: Optional
@@ -17329,7 +17306,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
17329
17306
  args: [APP_CONFIG_OPTIONS]
17330
17307
  }] }]; } });
17331
17308
 
17332
- const moment$5 = momentImported;
17333
17309
  const AndroidOsEnvironment = Object.freeze({
17334
17310
  DIRECTORY_DOWNLOADS: 'Download',
17335
17311
  DIRECTORY_DOWNLOADS_OLD: 'Downloads', // Old name, for older Android version
@@ -17615,16 +17591,16 @@ class PlatformService extends StartableService {
17615
17591
  }
17616
17592
  // config moment lib
17617
17593
  try {
17618
- moment$5.locale(event.lang);
17594
+ moment.locale(event.lang);
17619
17595
  console.debug('[platform] Use locale {' + event.lang + '}');
17620
17596
  }
17621
17597
  // If error, fallback to en
17622
17598
  catch (err) {
17623
- moment$5.locale('en');
17599
+ moment.locale('en');
17624
17600
  console.warn('[platform] Unknown local for moment lib. Using default [en]');
17625
17601
  }
17626
17602
  // Config date adapter
17627
- this.dateAdapter.setLocale(moment$5.locale());
17603
+ this.dateAdapter.setLocale(moment.locale());
17628
17604
  }
17629
17605
  });
17630
17606
  this.settings.onChange.subscribe(data => {
@@ -24640,7 +24616,6 @@ class AppTable {
24640
24616
  this.defaultPageSize = DEFAULT_PAGE_SIZE;
24641
24617
  this.defaultPageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS;
24642
24618
  this.onRefresh = new EventEmitter();
24643
- this.onOpenIdAndRow = new EventEmitter();
24644
24619
  this.onOpenRow = new EventEmitter();
24645
24620
  this.onNewRow = new EventEmitter();
24646
24621
  this.onStartEditingRow = new EventEmitter();
@@ -25056,8 +25031,8 @@ class AppTable {
25056
25031
  }
25057
25032
  }
25058
25033
  confirmAndAdd(event, row) {
25059
- if (row && !this.confirmEditCreate(event, row)) {
25060
- return false;
25034
+ if (!this.confirmEditCreate(event, row)) {
25035
+ return Promise.resolve(false);
25061
25036
  }
25062
25037
  // Add row
25063
25038
  return this.addRow(event);
@@ -25708,11 +25683,6 @@ class AppTable {
25708
25683
  if (this.debug && this.dirty) {
25709
25684
  console.warn('[table] Opening row details, but table has unsaved changes!');
25710
25685
  }
25711
- if (this.onOpenIdAndRow.observers.length) {
25712
- console.warn('[table] Detected deprecated use of (onOpenIdAndRow). Please use (onOpenRow) instead');
25713
- this.onOpenIdAndRow.emit({ id, row });
25714
- return true;
25715
- }
25716
25686
  if (this.onOpenRow.observers.length) {
25717
25687
  this.onOpenRow.emit(row);
25718
25688
  return true;
@@ -26148,7 +26118,7 @@ class AppTable {
26148
26118
  }
26149
26119
  }
26150
26120
  AppTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AppTable, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
26151
- AppTable.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.5", type: AppTable, inputs: { settingsId: "settingsId", debug: "debug", i18nColumnPrefix: "i18nColumnPrefix", i18nColumnSuffix: "i18nColumnSuffix", autoLoad: "autoLoad", readOnly: "readOnly", inlineEdition: "inlineEdition", focusFirstColumn: "focusFirstColumn", confirmBeforeDelete: "confirmBeforeDelete", confirmBeforeCancel: "confirmBeforeCancel", undoableDeletion: "undoableDeletion", saveBeforeDelete: "saveBeforeDelete", keepEditedRowOnSave: "keepEditedRowOnSave", saveBeforeSort: "saveBeforeSort", saveBeforeFilter: "saveBeforeFilter", propagateRowError: "propagateRowError", defaultSortBy: "defaultSortBy", defaultSortDirection: "defaultSortDirection", defaultPageSize: "defaultPageSize", defaultPageSizeOptions: "defaultPageSizeOptions", focusColumn: "focusColumn", dataSource: "dataSource", filter: "filter", disabled: "disabled", paginator: "paginator" }, outputs: { onRefresh: "onRefresh", onOpenIdAndRow: "onOpenIdAndRow", onOpenRow: "onOpenRow", onNewRow: "onNewRow", onStartEditingRow: "onStartEditingRow", onConfirmEditCreateRow: "onConfirmEditCreateRow", onCancelOrDeleteRow: "onCancelOrDeleteRow", onBeforeDeleteRows: "onBeforeDeleteRows", onBeforeCancelRows: "onBeforeCancelRows", onBeforeSave: "onBeforeSave", onAfterDeletedRows: "onAfterDeletedRows", onSort: "onSort", onDirty: "onDirty", onError: "onError" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "childPaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0 });
26121
+ AppTable.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.5", type: AppTable, inputs: { settingsId: "settingsId", debug: "debug", i18nColumnPrefix: "i18nColumnPrefix", i18nColumnSuffix: "i18nColumnSuffix", autoLoad: "autoLoad", readOnly: "readOnly", inlineEdition: "inlineEdition", focusFirstColumn: "focusFirstColumn", confirmBeforeDelete: "confirmBeforeDelete", confirmBeforeCancel: "confirmBeforeCancel", undoableDeletion: "undoableDeletion", saveBeforeDelete: "saveBeforeDelete", keepEditedRowOnSave: "keepEditedRowOnSave", saveBeforeSort: "saveBeforeSort", saveBeforeFilter: "saveBeforeFilter", propagateRowError: "propagateRowError", defaultSortBy: "defaultSortBy", defaultSortDirection: "defaultSortDirection", defaultPageSize: "defaultPageSize", defaultPageSizeOptions: "defaultPageSizeOptions", focusColumn: "focusColumn", dataSource: "dataSource", filter: "filter", disabled: "disabled", paginator: "paginator" }, outputs: { onRefresh: "onRefresh", onOpenRow: "onOpenRow", onNewRow: "onNewRow", onStartEditingRow: "onStartEditingRow", onConfirmEditCreateRow: "onConfirmEditCreateRow", onCancelOrDeleteRow: "onCancelOrDeleteRow", onBeforeDeleteRows: "onBeforeDeleteRows", onBeforeCancelRows: "onBeforeCancelRows", onBeforeSave: "onBeforeSave", onAfterDeletedRows: "onAfterDeletedRows", onSort: "onSort", onDirty: "onDirty", onError: "onError" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "childPaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0 });
26152
26122
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AppTable, decorators: [{
26153
26123
  type: Directive
26154
26124
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: undefined }, { type: EntitiesTableDataSource }, { type: undefined }]; }, propDecorators: { settingsId: [{
@@ -26199,8 +26169,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
26199
26169
  type: Input
26200
26170
  }], onRefresh: [{
26201
26171
  type: Output
26202
- }], onOpenIdAndRow: [{
26203
- type: Output
26204
26172
  }], onOpenRow: [{
26205
26173
  type: Output
26206
26174
  }], onNewRow: [{
@@ -27986,7 +27954,6 @@ const SocialErrorCodes = {
27986
27954
  SUBSCRIBE_JOB_PROGRESSION_ERROR: 50010
27987
27955
  };
27988
27956
 
27989
- const moment$4 = momentImported;
27990
27957
  const APP_USER_EVENT_SERVICE = new InjectionToken('UserEventService');
27991
27958
  class AbstractUserEventService extends BaseGraphqlService {
27992
27959
  constructor(graphql, accountService, network, translate, options) {
@@ -28346,7 +28313,7 @@ class AbstractUserEventService extends BaseGraphqlService {
28346
28313
  }
28347
28314
  resetCount() {
28348
28315
  this._countSubject.next(undefined);
28349
- this.resetCountDate = moment$4();
28316
+ this.resetCountDate = moment();
28350
28317
  // restart listening count changes
28351
28318
  this.startListenCountChanges();
28352
28319
  }
@@ -28398,7 +28365,7 @@ class AbstractUserEventService extends BaseGraphqlService {
28398
28365
  if (!userEvents.length)
28399
28366
  return;
28400
28367
  // set read date
28401
- userEvents.forEach(userEvent => userEvent.readDate = moment$4());
28368
+ userEvents.forEach(userEvent => userEvent.readDate = moment());
28402
28369
  // split local/remote entities
28403
28370
  const localEntities = userEvents.filter(EntityUtils.isLocal);
28404
28371
  const remoteEntities = userEvents.filter(EntityUtils.isRemote);
@@ -30206,13 +30173,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
30206
30173
  args: [{ selector: 'app-latlong-test', 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>Lat/Long 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 <!-- Empty value -->\n <form *ngIf=\"form|formGetGroup:'empty' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <ion-row><ion-col><ion-text><h4>Empty, with defaults</h4></ion-text></ion-col></ion-row>\n\n <ion-row >\n\n <!-- DD Default sign -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Format DD, defaultSign '-'\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(formGroup.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DD\"\n defaultSign=\"-\"\n placeholder=\"Latitude\">\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DD\"\n defaultSign=\"-\"\n placeholder=\"Longitude\">\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix\n (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMM Default sign -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Format DDMM, defaultSign '+'\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(formGroup.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n defaultSign=\"+\"\n placeholder=\"Latitude\">\n\n <mat-icon matPrefix >room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix\n (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n defaultSign=\"+\"\n placeholder=\"Longitude\">\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix\n (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n </ion-grid>\n </form>\n\n <form *ngIf=\"form|formGetGroup:'enable' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <!-- With value -->\n <ion-row><ion-col><ion-text><h4>With value</h4></ion-text></ion-col></ion-row>\n\n <ion-row>\n\n <!-- DD -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Format DD\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(formGroup.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DD\"\n placeholder=\"Latitude\">\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DD\"\n placeholder=\"Longitude\">\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMMSS -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Format DDMM\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(formGroup.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\">\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Longitude\">\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n\n <!-- DDMMSS -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Format DDMMSS\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(formGroup.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMMSS\"\n placeholder=\"Latitude\">\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMMSS\"\n placeholder=\"Longitude\">\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <!-- Disable -->\n <form *ngIf=\"form|formGetGroup:'disable' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <ion-row><ion-col><ion-text><h4>Disabled control</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(formGroup.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\">\n <mat-icon matPrefix>room</mat-icon>\n <mat-icon matSuffix>gps_fixed</mat-icon>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Longitude\">\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix\n (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly (control is enable)\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n </mat-checkbox>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field #readonlyField [formControl]=\"form|formGetControl: 'enable.latitude'\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [readonly]=\"true\">\n <mat-icon matPrefix>room</mat-icon>\n <mat-icon matSuffix>gps_fixed</mat-icon>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n </form>\n\n</ion-content>\n" }]
30207
30174
  }], ctorParameters: function () { return [{ type: i1$2.UntypedFormBuilder }]; } });
30208
30175
 
30209
- const moment$3 = momentImported;
30210
30176
  class SwipeTestPage {
30211
30177
  constructor(formBuilder, dateFormatPipe) {
30212
30178
  this.formBuilder = formBuilder;
30213
30179
  this.dateFormatPipe = dateFormatPipe;
30214
30180
  this.$dates = new BehaviorSubject(undefined);
30215
- this._today = moment$3().startOf('day');
30181
+ this._today = moment().startOf('day');
30216
30182
  this.form = formBuilder.group({
30217
30183
  empty: [null, Validators.required],
30218
30184
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -30225,7 +30191,7 @@ class SwipeTestPage {
30225
30191
  ngOnInit() {
30226
30192
  const dates = [];
30227
30193
  for (let d = 0; d < 7; d++) {
30228
- dates[d] = moment$3(this._today).add(d - 3, 'day');
30194
+ dates[d] = moment(this._today).add(d - 3, 'day');
30229
30195
  }
30230
30196
  this.$dates.next(dates);
30231
30197
  this.loadData();
@@ -30260,7 +30226,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
30260
30226
  args: [{ selector: 'app-swipe-test', 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>Swipe test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <h1>Swipe page:</h1>\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <ion-grid>\n\n <ion-row>\n <!-- empty -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-swipe-field formControlName=\"empty\"\n placeholder=\"placeholder\"\n [items]=\"$dates\"\n [displayWith]=\"displayDate()\"\n [equals]=\"compareDate()\"\n [tabindex]=\"1\"\n [debug]=\"true\"\n >\n </mat-swipe-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- date -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Date\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-swipe-field formControlName=\"date\"\n placeholder=\"placeholder\"\n [items]=\"$dates\"\n [displayWith]=\"displayDate()\"\n [equals]=\"compareDate()\"\n [clearable]=\"true\"\n [tabindex]=\"2\"\n [debug]=\"true\"\n >\n </mat-swipe-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <!-- disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled empty\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-swipe-field formControlName=\"disabledEmpty\"\n placeholder=\"placeholder\"\n [items]=\"$dates\"\n [displayWith]=\"displayDate()\"\n [equals]=\"compareDate()\"\n [clearable]=\"true\"\n [tabindex]=\"3\"\n [debug]=\"true\"\n >\n </mat-swipe-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n<!-- read-only-->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled with date\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-swipe-field formControlName=\"disabledDate\"\n placeholder=\"placeholder\"\n [items]=\"$dates\"\n [displayWith]=\"displayDate()\"\n [equals]=\"compareDate()\"\n [clearable]=\"true\"\n [tabindex]=\"4\"\n [debug]=\"true\"\n >\n </mat-swipe-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n\n </ion-grid>\n\n </form>\n\n</ion-content>\n" }]
30261
30227
  }], ctorParameters: function () { return [{ type: i1$2.UntypedFormBuilder }, { type: DateFormatPipe }]; } });
30262
30228
 
30263
- const moment$2 = momentImported;
30264
30229
  class DateTimeTestPage {
30265
30230
  constructor(platform, formBuilder, cd) {
30266
30231
  this.platform = platform;
@@ -30293,7 +30258,7 @@ class DateTimeTestPage {
30293
30258
  }
30294
30259
  // Load the form with data
30295
30260
  async loadData() {
30296
- const now = moment$2();
30261
+ const now = moment();
30297
30262
  const data = {
30298
30263
  empty: null,
30299
30264
  emptyRequired: null,
@@ -30527,7 +30492,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
30527
30492
  args: [{ selector: 'app-numpad-test', 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>Numeric pad test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <h1>Numpad test page:</h1>\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <ion-grid>\n\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Decimal field, readonly\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field >\n <input matInput type=\"text\" formControlName=\"empty\" placeholder=\"Empty decimal field\"\n autocomplete=\"off\"\n [matNumpad]=\"numpadDecimal\"\n readonly>\n <mat-numpad [decimal]=\"true\" #numpadDecimal></mat-numpad>\n </mat-form-field>\n\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- filled -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Integer field\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field >\n <input matInput type=\"number\" formControlName=\"integer\" placeholder=\"Filled integer field\"\n autocomplete=\"off\"\n [matNumpad]=\"numpadInteger\">\n <mat-numpad #numpadInteger [decimal]=\"false\"></mat-numpad>\n\n </mat-form-field>\n\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- append to input -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Attach to input, readonly\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field >\n <input matInput type=\"text\" formControlName=\"integer\" placeholder=\"A number\"\n autocomplete=\"off\"\n [matNumpad]=\"numpadAppendToInput\"\n readonly>\n <mat-numpad #numpadAppendToInput [appendToInput]=\"true\"></mat-numpad>\n </mat-form-field>\n\n\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 Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field >\n <input matInput type=\"number\" formControlName=\"disable\" placeholder=\"Disabled field\"\n autocomplete=\"off\"\n [matNumpad]=\"numpadDisabled\">\n <mat-numpad #numpadDisabled></mat-numpad>\n </mat-form-field>\n\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n\n <!-- Other field (for comparision) -->\n <ion-row><ion-col><ion-text><h4>Other field type (for style comparision)</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Mat date time\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field formControlName=\"datetime\" placeholder=\"Date/Time field (desktop)\">\n </mat-date-time-field>\n\n <mat-date-time-field formControlName=\"datetime\"\n placeholder=\"Date/Time field (mobile)\"\n [mobile]=\"true\">\n </mat-date-time-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </form>\n\n</ion-content>\n" }]
30528
30493
  }], ctorParameters: function () { return [{ type: i1$2.UntypedFormBuilder }]; } });
30529
30494
 
30530
- const moment$1 = momentImported;
30531
30495
  class DateTestPage {
30532
30496
  constructor(formBuilder, cd) {
30533
30497
  this.formBuilder = formBuilder;
@@ -30559,7 +30523,7 @@ class DateTestPage {
30559
30523
  }
30560
30524
  // Load the form with data
30561
30525
  async loadData() {
30562
- const now = moment$1();
30526
+ const now = moment();
30563
30527
  const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
30564
30528
  const data = {
30565
30529
  empty: null,
@@ -30688,7 +30652,7 @@ class ObservableTestPage {
30688
30652
  this._stopSubject.next();
30689
30653
  }
30690
30654
  log(message, ...args) {
30691
- let fullMessage = `${toDateISOString(moment$7())} - ${message}`;
30655
+ let fullMessage = `${toDateISOString(moment())} - ${message}`;
30692
30656
  if (args?.length) {
30693
30657
  fullMessage += ' - <small>' + args.map(JSON.stringify).join(', ') + '</small>';
30694
30658
  }
@@ -32116,7 +32080,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
32116
32080
  args: [ENVIRONMENT]
32117
32081
  }] }]; } });
32118
32082
 
32119
- const moment = momentImported;
32120
32083
  class UserEventTestingPage {
32121
32084
  constructor(userEventService, router, alertController, translateService) {
32122
32085
  this.userEventService = userEventService;
@@ -32454,5 +32417,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
32454
32417
  * Generated bundle index. Do not edit.
32455
32418
  */
32456
32419
 
32457
- export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_JOB_PROGRESSION_SERVICE, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_MENU_OPTIONS, APP_STORAGE, APP_TESTING_PAGES, APP_USER_EVENT_SERVICE, AboutModal, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, AdminUsersModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppIconComponent, AppIconModule, AppImageGalleryComponent, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppRegisterModule, AppTabEditor, AppTabEditorOptions, AppTable, AppTableUtils, AppUpdateOfflineModeCard, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayJoinPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AudioTestingModule, AudioTestingPage, AuthForm, AuthGuardService, AuthModal, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, BadgeDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTestPage, DateTimeTestPage, DateUtils, DebugComponent, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, Fragments, GalleryTestPage, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, ImageAttachment, ImageAttachmentFilter, ImageAttachmentService, ImageGalleryModule, ImageGalleryTestingModule, ImageModule, ImageService, ImagesUtils, InMemoryEntitiesService, InstallUpgradeCardModule, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, Job, JobModule, JobProgression, JobProgressionIcon, JobProgressionList, JobProgressionService, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatAutocompleteFieldUtils, MatBooleanField, MatChipsField, MatColorPipe, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuOptions, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, NumpadTestPage, ObservableTestPage, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertiesFormTestPage, PropertiesFormTestingModule, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, RegisterForm, RegisterModal, ResizableComponent, ResizableDirective, ResizableModule, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SelectPeerModule, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedBadgeModule, SharedDebugModule, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedToolbarModule, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, StartableService, StatusById, StatusIds, StatusList, StorageDrivers, StorageService, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, ToastTestingModule, ToastTestingPage, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UserEventModule, UserEventNotificationIcon, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UsersPage, ZERO_PLACEHOLDER_CHAR, accountToString, adaptValueToControl, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isBlankString, isCapacitor, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moment$7 as moment, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, patchValueInArray, propertiesPathComparator, propertyComparator, propertyPathComparator, pushValueInArray, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, tz, uncapitalizeFirstLetter, updateValueAndValidity, uuidv4, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
32420
+ export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_JOB_PROGRESSION_SERVICE, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_MENU_OPTIONS, APP_STORAGE, APP_TESTING_PAGES, APP_USER_EVENT_SERVICE, AboutModal, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, AdminUsersModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppIconComponent, AppIconModule, AppImageGalleryComponent, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppRegisterModule, AppTabEditor, AppTabEditorOptions, AppTable, AppTableUtils, AppUpdateOfflineModeCard, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayJoinPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AudioTestingModule, AudioTestingPage, AuthForm, AuthGuardService, AuthModal, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, BadgeDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTestPage, DateTimeTestPage, DateUtils, DebugComponent, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ED25519_SEED_LENGTH, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, Fragments, GalleryTestPage, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, ImageAttachment, ImageAttachmentFilter, ImageAttachmentService, ImageGalleryModule, ImageGalleryTestingModule, ImageModule, ImageService, ImagesUtils, InMemoryEntitiesService, InstallUpgradeCardModule, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, Job, JobModule, JobProgression, JobProgressionIcon, JobProgressionList, JobProgressionService, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatAutocompleteFieldUtils, MatBooleanField, MatChipsField, MatColorPipe, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuOptions, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, NumpadTestPage, ObservableTestPage, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertiesFormTestPage, PropertiesFormTestingModule, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, RegisterForm, RegisterModal, ResizableComponent, ResizableDirective, ResizableModule, SCRYPT_PARAMS, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SelectPeerModule, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedBadgeModule, SharedDebugModule, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedToolbarModule, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, StartableService, StatusById, StatusIds, StatusList, StorageDrivers, StorageService, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, ToastTestingModule, ToastTestingPage, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UserEventModule, UserEventNotificationIcon, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UsersPage, ZERO_PLACEHOLDER_CHAR, accountToString, adaptValueToControl, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isBlankString, isCapacitor, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moment, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, patchValueInArray, propertiesPathComparator, propertyComparator, propertyPathComparator, pushValueInArray, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, tz, uncapitalizeFirstLetter, updateValueAndValidity, uuidv4, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
32458
32421
  //# sourceMappingURL=sumaris-net.ngx-components.mjs.map