@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
@@ -70,14 +70,12 @@ import * as momentImported from 'moment';
70
70
  import { isMoment } from 'moment';
71
71
  import * as i1 from '@angular/material-moment-adapter';
72
72
  import { MatMomentDateModule } from '@angular/material-moment-adapter';
73
- import * as i11$1 from 'angular2-text-mask';
74
- import { TextMaskModule } from 'angular2-text-mask';
75
- import { sign, box, hash, verify } from 'tweetnacl';
76
- import 'tweetnacl-util';
77
- import 'scrypt-async';
73
+ import { decodeUTF8, encodeBase64, decodeBase64 } from 'tweetnacl-util';
78
74
  import 'hammerjs';
79
75
  import * as momentTZImported from 'moment-timezone';
80
76
  import * as uuidv4Imported from 'uuid/v4';
77
+ import * as i11$1 from 'angular2-text-mask';
78
+ import { TextMaskModule } from 'angular2-text-mask';
81
79
  import * as i10 from '@angular/material/datepicker';
82
80
  import { MatDatepickerModule } from '@angular/material/datepicker';
83
81
  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';
@@ -2540,7 +2544,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
2540
2544
  type: Input
2541
2545
  }] } });
2542
2546
 
2543
- const moment$a = momentImported;
2547
+ const moment = momentImported;
2548
+ const tz = momentTZImported;
2549
+ const uuidv4 = uuidv4Imported;
2550
+
2544
2551
  class DateDiffDurationPipe {
2545
2552
  constructor(dateAdapter, translate) {
2546
2553
  this.dateAdapter = dateAdapter;
@@ -2556,11 +2563,11 @@ class DateDiffDurationPipe {
2556
2563
  return this.format(startDate, endDate, args);
2557
2564
  }
2558
2565
  format(startDate, endDate, args) {
2559
- const duration = moment$a.duration(endDate.diff(startDate));
2566
+ const duration = moment.duration(endDate.diff(startDate));
2560
2567
  if (duration.asMinutes() < 0)
2561
2568
  return '';
2562
2569
  const withSeconds = args === null || args === void 0 ? void 0 : args.seconds;
2563
- const timeDuration = moment$a(0)
2570
+ const timeDuration = moment(0)
2564
2571
  .hour(duration.hours())
2565
2572
  .minute(duration.minutes());
2566
2573
  if (withSeconds) {
@@ -2995,7 +3002,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
2995
3002
  args: [{ name: 'fileSize' }]
2996
3003
  }] });
2997
3004
 
2998
- const moment$9 = momentImported;
2999
3005
  const DATE_UNIX_TIMESTAMP = 'X';
3000
3006
  const DATE_UNIX_MS_TIMESTAMP = 'x';
3001
3007
  const MOMENT_NO_TIME_PROPERTY = '_hasNoTime';
@@ -3084,37 +3090,37 @@ function fromDateISOString(value) {
3084
3090
  return value;
3085
3091
  if (typeof value === 'string' && value.length === 10) {
3086
3092
  // Parse the input value, as a date only
3087
- const dateOnly = moment$9(value, DATE_PATTERN);
3093
+ const dateOnly = moment(value, DATE_PATTERN);
3088
3094
  if (dateOnly.isValid())
3089
3095
  return DateUtils.markNoTime(dateOnly);
3090
3096
  }
3091
3097
  // Parse the input value, as a ISO date time
3092
- const date = moment$9(value, DATE_ISO_PATTERN);
3098
+ const date = moment(value, DATE_ISO_PATTERN);
3093
3099
  if (date.isValid())
3094
3100
  return date;
3095
3101
  // Not valid: trying to convert from unix timestamp
3096
3102
  if (typeof value === 'string') {
3097
3103
  console.warn('Wrong date format - Trying to convert from local time: ' + value);
3098
3104
  if (value.length === 10) {
3099
- return moment$9(value, DATE_UNIX_TIMESTAMP);
3105
+ return moment(value, DATE_UNIX_TIMESTAMP);
3100
3106
  }
3101
3107
  else if (value.length === 13) {
3102
- return moment$9(value, DATE_UNIX_MS_TIMESTAMP);
3108
+ return moment(value, DATE_UNIX_MS_TIMESTAMP);
3103
3109
  }
3104
3110
  }
3105
3111
  console.warn('Unable to parse date: ' + value);
3106
3112
  return undefined;
3107
3113
  }
3108
3114
  function fromUnixTimestamp(timeInSec) {
3109
- return moment$9(timeInSec, DATE_UNIX_TIMESTAMP);
3115
+ return moment(timeInSec, DATE_UNIX_TIMESTAMP);
3110
3116
  }
3111
3117
  function fromUnixMsTimestamp(timeInMs) {
3112
- return moment$9(timeInMs, DATE_UNIX_MS_TIMESTAMP);
3118
+ return moment(timeInMs, DATE_UNIX_MS_TIMESTAMP);
3113
3119
  }
3114
3120
  function toDuration(value, unit) {
3115
3121
  if (!value)
3116
3122
  return undefined;
3117
- const duration = moment$9.duration(value, unit);
3123
+ const duration = moment.duration(value, unit);
3118
3124
  // fix 990+ ms
3119
3125
  if (duration.milliseconds() >= 990) {
3120
3126
  duration.add(1000 - duration.milliseconds(), 'ms');
@@ -3390,7 +3396,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
3390
3396
  type: Injectable
3391
3397
  }] });
3392
3398
 
3393
- const moment$8 = momentImported;
3394
3399
  // @dynamic
3395
3400
  class SharedValidators {
3396
3401
  static getDoubleRegexp(maxDecimals) {
@@ -3471,7 +3476,7 @@ class SharedValidators {
3471
3476
  }
3472
3477
  static validDate(control) {
3473
3478
  const value = control.value;
3474
- const date = !value || moment$8.isMoment(value) ? value : moment$8(value, DATE_ISO_PATTERN);
3479
+ const date = !value || moment.isMoment(value) ? value : moment(value, DATE_ISO_PATTERN);
3475
3480
  if (date && (!date.isValid() || date.year() < 1970)) {
3476
3481
  return { validDate: true };
3477
3482
  }
@@ -5708,10 +5713,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
5708
5713
  }]
5709
5714
  }] });
5710
5715
 
5711
- const moment$7 = momentImported;
5712
- const tz = momentTZImported;
5713
- const uuidv4 = uuidv4Imported;
5714
-
5715
5716
  const DEFAULT_VALUE_ACCESSOR$5 = {
5716
5717
  provide: NG_VALUE_ACCESSOR,
5717
5718
  useExisting: forwardRef(() => MatDate),
@@ -5893,7 +5894,7 @@ class MatDate {
5893
5894
  // No value, but mobile mode: use the current date
5894
5895
  if (!value && this.mobile) {
5895
5896
  this._writing = true;
5896
- value = DateUtils.resetTime(moment$7().locale(this.locale), this.timezone);
5897
+ value = DateUtils.resetTime(moment().locale(this.locale), this.timezone);
5897
5898
  this.formControl.setValue(value, { emitEvent: false });
5898
5899
  this.markForCheck();
5899
5900
  this._writing = false;
@@ -6266,7 +6267,7 @@ class MatDateTime {
6266
6267
  // No value, but mobile mode: use the current date
6267
6268
  if (!value && this.mobile) {
6268
6269
  this._writing = true;
6269
- value = DateUtils.resetTime(moment$7().locale(this.locale));
6270
+ value = DateUtils.resetTime(moment().locale(this.locale));
6270
6271
  this.formControl.setValue(value, { emitEvent: false });
6271
6272
  this.markForCheck();
6272
6273
  this._writing = false;
@@ -13070,7 +13071,7 @@ let Peer = Peer_1 = class Peer extends Entity {
13070
13071
  }
13071
13072
  static parseUrl(peerUrl) {
13072
13073
  const url = new URL(peerUrl);
13073
- return Peer_1.fromObject({
13074
+ return this.fromObject({
13074
13075
  dns: url.hostname,
13075
13076
  port: isNilOrBlank(url.port) ? undefined : url.port,
13076
13077
  useSsl: url.protocol && (url.protocol.startsWith('https') || url.protocol.startsWith('wss')),
@@ -13088,7 +13089,7 @@ let Peer = Peer_1 = class Peer extends Entity {
13088
13089
  return path.substring(1);
13089
13090
  return path;
13090
13091
  }).filter(isNotNilOrBlank);
13091
- return [noTrailingSlash(Peer_1.fromObject(peer).url)].concat(...paths).join('/');
13092
+ return [noTrailingSlash(this.fromObject(peer).url)].concat(...paths).join('/');
13092
13093
  }
13093
13094
  asObject(options) {
13094
13095
  return super.asObject(options);
@@ -13124,7 +13125,6 @@ Peer = Peer_1 = __decorate([
13124
13125
  EntityClass({ typename: 'PeerVO' })
13125
13126
  ], Peer);
13126
13127
 
13127
- const moment$6 = momentImported;
13128
13128
  const SETTINGS_STORAGE_KEY = 'settings';
13129
13129
  const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
13130
13130
  // fixme: this constant points to static environment
@@ -13362,11 +13362,11 @@ class LocalSettingsService extends StartableService {
13362
13362
  if (!feature) {
13363
13363
  feature = {
13364
13364
  name: featureName.toLowerCase(),
13365
- lastSyncDate: moment$6().toISOString()
13365
+ lastSyncDate: moment().toISOString()
13366
13366
  };
13367
13367
  }
13368
13368
  else {
13369
- feature.lastSyncDate = moment$6().toISOString();
13369
+ feature.lastSyncDate = moment().toISOString();
13370
13370
  }
13371
13371
  this.saveOfflineFeature(feature);
13372
13372
  }
@@ -13527,7 +13527,7 @@ class LocalSettingsService extends StartableService {
13527
13527
  if (!page || !page.title || !page.path)
13528
13528
  throw Error('Missing required argument \'page\', \'page.path\' or \'page.title\'');
13529
13529
  // Set time
13530
- page.time = page.time || moment$6();
13530
+ page.time = page.time || moment();
13531
13531
  // Clean the title (remove <small> tags)
13532
13532
  if (!opts || opts.removeTitleSmallTag !== false) {
13533
13533
  const tagIndex = page.title.indexOf('</small>');
@@ -13928,7 +13928,7 @@ class Base58 {
13928
13928
  }
13929
13929
  static decode(string) {
13930
13930
  if (string.length === 0)
13931
- return (new Uint8Array());
13931
+ return (new Uint8Array(0));
13932
13932
  const input = string.split('').map(function (c) {
13933
13933
  return Base58.getAlphabetMap()[c];
13934
13934
  });
@@ -13959,124 +13959,111 @@ class Base58 {
13959
13959
  }
13960
13960
  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
13961
13961
 
13962
- const scrypt = require('scrypt-async');
13963
- const sha256$1 = require('hash.js/lib/hash/sha/256');
13964
- const sha512 = require('hash.js/lib/hash/sha/512');
13965
- const nacl = {
13966
- sign,
13967
- box,
13968
- hash,
13969
- verify,
13970
- util: require('tweetnacl-util'),
13971
- constants: {
13972
- crypto_sign_BYTES: 64,
13973
- SEED_LENGTH: 32,
13974
- SCRYPT_PARAMS: {
13975
- SIMPLE: {
13976
- N: 2048,
13977
- r: 8,
13978
- p: 1,
13979
- memory: -1 // default
13980
- },
13981
- DEFAULT: {
13982
- N: 4096,
13983
- r: 16,
13984
- p: 1,
13985
- memory: -1 // default
13986
- },
13987
- SECURE: {
13988
- N: 16384,
13989
- r: 32,
13990
- p: 2,
13991
- memory: -1 // default
13992
- },
13993
- HARDEST: {
13994
- N: 65536,
13995
- r: 32,
13996
- p: 4,
13997
- memory: -1 // default
13998
- },
13999
- EXTREME: {
14000
- N: 262144,
14001
- r: 64,
14002
- p: 8,
14003
- memory: -1 // default
14004
- }
14005
- }
13962
+ const ED25519_SEED_LENGTH = 32; // Length of a ED25519 seed
13963
+ const SCRYPT_PARAMS = {
13964
+ SIMPLE: {
13965
+ N: 2048,
13966
+ r: 8,
13967
+ p: 1
13968
+ },
13969
+ DEFAULT: {
13970
+ N: 4096,
13971
+ r: 16,
13972
+ p: 1
13973
+ },
13974
+ SECURE: {
13975
+ N: 16384,
13976
+ r: 32,
13977
+ p: 2
13978
+ },
13979
+ HARDEST: {
13980
+ N: 65536,
13981
+ r: 32,
13982
+ p: 4
13983
+ },
13984
+ EXTREME: {
13985
+ N: 262144,
13986
+ r: 64,
13987
+ p: 8
14006
13988
  }
14007
13989
  };
14008
13990
  class CryptoService {
13991
+ static get started() {
13992
+ return this._ready;
13993
+ }
13994
+ static ready() {
13995
+ return __awaiter(this, void 0, void 0, function* () {
13996
+ if (this._ready)
13997
+ return; // OK
13998
+ yield cryptoWaitReady();
13999
+ this._ready = true;
14000
+ });
14001
+ }
14009
14002
  /**
14010
- * Generate sign keypair, sugin scrypt, from a salt and a password
14003
+ * Generate a sign keypair, using scrypt, from a salt and a password
14011
14004
  *
14012
14005
  * @param salt
14013
14006
  * @param password
14014
14007
  * @param scryptParams
14015
14008
  */
14016
- scryptKeypair(salt, password, scryptParams) {
14017
- return new Promise((resolve) => {
14018
- scrypt(password, salt, {
14019
- N: scryptParams && scryptParams.N || nacl.constants.SCRYPT_PARAMS.DEFAULT.N,
14020
- r: scryptParams && scryptParams.r || nacl.constants.SCRYPT_PARAMS.DEFAULT.r,
14021
- p: scryptParams && scryptParams.p || nacl.constants.SCRYPT_PARAMS.DEFAULT.p,
14022
- dkLen: nacl.constants.SEED_LENGTH,
14023
- encoding: 'base64'
14024
- }, function (derivedKey) {
14025
- resolve(derivedKey);
14026
- });
14027
- })
14028
- .then((seed) => {
14029
- const byteseed = nacl.util.decodeBase64(seed);
14030
- const signKeypair = nacl.sign.keyPair.fromSeed(byteseed);
14031
- return {
14032
- publicKey: signKeypair.publicKey,
14033
- secretKey: signKeypair.secretKey
14034
- };
14009
+ static scryptKeypair(salt, password, scryptParams) {
14010
+ return __awaiter(this, void 0, void 0, function* () {
14011
+ if (!this.started)
14012
+ yield this.ready();
14013
+ const passwordU8a = decodeUTF8(password);
14014
+ const saltU8a = decodeUTF8(salt);
14015
+ const result = scryptEncode(passwordU8a, saltU8a, scryptParams || SCRYPT_PARAMS.DEFAULT);
14016
+ const seed = result.password.slice(0, ED25519_SEED_LENGTH);
14017
+ return ed25519PairFromSeed(seed);
14035
14018
  });
14036
14019
  }
14037
14020
  /**
14038
14021
  * Sign a message, from a key pair
14039
14022
  */
14040
- sign(message, keypair) {
14041
- return new Promise((resolve) => {
14042
- const m = nacl.util.decodeUTF8(message);
14043
- const signedMsg = nacl.sign(m, keypair.secretKey);
14044
- const sig = new Uint8Array(nacl.constants.crypto_sign_BYTES);
14045
- for (let i = 0; i < sig.length; i++)
14046
- sig[i] = signedMsg[i];
14047
- const signature = nacl.util.encodeBase64(sig);
14048
- resolve(signature);
14023
+ static sign(message, keypair) {
14024
+ return __awaiter(this, void 0, void 0, function* () {
14025
+ if (!this.started)
14026
+ yield this.ready();
14027
+ const m = decodeUTF8(message);
14028
+ const sig = ed25519Sign(m, keypair);
14029
+ return encodeBase64(sig);
14049
14030
  });
14050
14031
  }
14051
14032
  /**
14052
14033
  * Sign a message, from a key pair
14053
14034
  */
14054
- verify(message, signature, pubkey) {
14055
- return new Promise((resolve) => {
14056
- const m = nacl.util.decodeUTF8(message);
14057
- const sig = nacl.util.decodeBase64(signature);
14058
- const pub = Base58.decode(pubkey);
14059
- const res = nacl.sign.detached.verify(m, sig, pub);
14060
- resolve(res);
14035
+ static verify(message, signature, publicKey) {
14036
+ return __awaiter(this, void 0, void 0, function* () {
14037
+ if (!this.started)
14038
+ yield this.ready();
14039
+ const m = decodeUTF8(message);
14040
+ const sig = decodeBase64(signature);
14041
+ const pub = Base58.decode(publicKey);
14042
+ return ed25519Verify(m, sig, pub);
14061
14043
  });
14062
14044
  }
14063
14045
  /**
14064
- * Hash (using SHA256) a message
14046
+ * Hash (using SHA256) a message, as Hex
14065
14047
  */
14066
- sha256(message) {
14067
- return sha256$1().update(message).digest('hex');
14048
+ static sha256(message) {
14049
+ const m = decodeUTF8(message);
14050
+ const bytes = sha256(utils.concatBytes(m));
14051
+ return bytesToHex(bytes);
14068
14052
  }
14069
14053
  /**
14070
- * Hash (using SHA512) a message
14054
+ * Hash (using SHA512) a message, as Hex
14071
14055
  */
14072
- sha512(message) {
14073
- return sha512().update(message).digest('hex');
14056
+ static sha512(message) {
14057
+ const m = decodeUTF8(message);
14058
+ const bytes = sha512(utils.concatBytes(m));
14059
+ return bytesToHex(bytes);
14074
14060
  }
14075
- encodeBase64(message) {
14076
- const m = nacl.util.decodeUTF8(message);
14077
- return nacl.util.encodeBase64(m);
14061
+ static encodeBase64(message) {
14062
+ const m = decodeUTF8(message);
14063
+ return encodeBase64(m);
14078
14064
  }
14079
14065
  }
14066
+ CryptoService._ready = false;
14080
14067
  CryptoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: CryptoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
14081
14068
  CryptoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: CryptoService, providedIn: 'root' });
14082
14069
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: CryptoService, decorators: [{
@@ -15803,7 +15790,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
15803
15790
  }] }];
15804
15791
  } });
15805
15792
 
15806
- const sha256 = require('hash.js/lib/hash/sha/256');
15807
15793
  class BaseGraphqlServiceOptions {
15808
15794
  }
15809
15795
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
@@ -15876,7 +15862,7 @@ class BaseGraphqlService extends StartableService {
15876
15862
  queries.forEach(query => {
15877
15863
  if (Array.isArray(opts.data)) {
15878
15864
  // Filter values, if a filter function exists
15879
- const data = query.insertFilterFn ? opts.data.filter(i => query.insertFilterFn(i)) : opts.data;
15865
+ const data = query.insertFilterFn ? opts.data.filter(d => query.insertFilterFn(d)) : opts.data;
15880
15866
  if (isNotEmptyArray(data)) {
15881
15867
  if (this._debug)
15882
15868
  console.debug(`[base-data-service] Inserting data into watching query: `, query.id);
@@ -15954,8 +15940,8 @@ class BaseGraphqlService extends StartableService {
15954
15940
  }
15955
15941
  /* -- protected methods -- */
15956
15942
  computeMutableWatchQueryId(opts) {
15957
- const queryName = opts.queryName || sha256().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
15958
- const variablesKey = opts.variables && sha256().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
15943
+ const queryName = opts.queryName || CryptoService.sha256(JSON.stringify(opts.query)).substring(0, 8);
15944
+ const variablesKey = opts.variables && CryptoService.sha256(JSON.stringify(opts.variables)).substring(0, 8) || '';
15959
15945
  return [queryName, opts.arrayFieldName, variablesKey].join('|');
15960
15946
  }
15961
15947
  findMutableWatchQueries(opts) {
@@ -16137,9 +16123,8 @@ const AccountSubscriptions = {
16137
16123
  }`
16138
16124
  };
16139
16125
  class AccountService extends BaseGraphqlService {
16140
- constructor(cryptoService, network, graphql, settings, storage, file, translate, toastController, environment) {
16126
+ constructor(network, graphql, settings, storage, file, translate, toastController, environment) {
16141
16127
  super(graphql, environment);
16142
- this.cryptoService = cryptoService;
16143
16128
  this.network = network;
16144
16129
  this.graphql = graphql;
16145
16130
  this.settings = settings;
@@ -16330,7 +16315,7 @@ class AccountService extends BaseGraphqlService {
16330
16315
  this._cache.loaded = false;
16331
16316
  const now = Date.now();
16332
16317
  try {
16333
- const keypair = yield this.cryptoService.scryptKeypair(data.username, data.password);
16318
+ const keypair = yield CryptoService.scryptKeypair(data.username, data.password);
16334
16319
  data.account.pubkey = Base58.encode(keypair.publicKey);
16335
16320
  // Default values
16336
16321
  data.account.settings = data.account.settings || new UserSettings();
@@ -16377,7 +16362,7 @@ class AccountService extends BaseGraphqlService {
16377
16362
  if (!(this._cache.authToken && tokenType === 'basic-and-token')) {
16378
16363
  if (!data || !data.username || !data.password)
16379
16364
  throw new Error('Missing username and password');
16380
- this._cache.authBasic = this.cryptoService.encodeBase64(`${data.username}:${data.password}`);
16365
+ this._cache.authBasic = CryptoService.encodeBase64(`${data.username}:${data.password}`);
16381
16366
  }
16382
16367
  }
16383
16368
  this.onAuthBasicChange.next(this._cache.authBasic);
@@ -16408,7 +16393,7 @@ class AccountService extends BaseGraphqlService {
16408
16393
  console.debug('[account] Login...');
16409
16394
  let keypair;
16410
16395
  try {
16411
- keypair = yield this.cryptoService.scryptKeypair(data.username, data.password);
16396
+ keypair = yield CryptoService.scryptKeypair(data.username, data.password);
16412
16397
  }
16413
16398
  catch (error) {
16414
16399
  console.error(error);
@@ -17038,13 +17023,13 @@ class AccountService extends BaseGraphqlService {
17038
17023
  if (!data || !data.authChallenge)
17039
17024
  throw challengeError; // Should never occur
17040
17025
  // Check server signature
17041
- const signatureOK = yield this.cryptoService.verify(data.authChallenge.challenge, data.authChallenge.signature, data.authChallenge.pubkey);
17026
+ const signatureOK = yield CryptoService.verify(data.authChallenge.challenge, data.authChallenge.signature, data.authChallenge.pubkey);
17042
17027
  if (!signatureOK) {
17043
17028
  console.warn('FIXME: Bad peer signature on auth challenge !', data.authChallenge);
17044
17029
  }
17045
17030
  // TODO: check server pubkey as a valid certificate
17046
17031
  // Do the challenge
17047
- const signature = yield this.cryptoService.sign(data.authChallenge.challenge, this._cache.keypair);
17032
+ const signature = yield CryptoService.sign(data.authChallenge.challenge, this._cache.keypair);
17048
17033
  const newToken = `${this._cache.pubkey}:${data.authChallenge.challenge}|${signature}`;
17049
17034
  // iterate with the new token
17050
17035
  return yield this.authenticateAndGetToken(newToken, (counter || 1) + 1 /* increment */);
@@ -17132,13 +17117,13 @@ class AccountService extends BaseGraphqlService {
17132
17117
  return Toasts.show(this.toastController, this.translate, opts);
17133
17118
  }
17134
17119
  }
17135
- 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 });
17120
+ 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 });
17136
17121
  AccountService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AccountService, providedIn: 'root' });
17137
17122
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AccountService, decorators: [{
17138
17123
  type: Injectable,
17139
17124
  args: [{ providedIn: 'root', deps: [ENVIRONMENT] }]
17140
17125
  }], ctorParameters: function () {
17141
- return [{ type: CryptoService }, { type: NetworkService }, { type: GraphqlService }, { type: LocalSettingsService }, { type: i3.Storage }, { type: FileService }, { type: i1$1.TranslateService, decorators: [{
17126
+ return [{ type: NetworkService }, { type: GraphqlService }, { type: LocalSettingsService }, { type: i3.Storage }, { type: FileService }, { type: i1$1.TranslateService, decorators: [{
17142
17127
  type: Optional
17143
17128
  }] }, { type: i2.ToastController, decorators: [{
17144
17129
  type: Optional
@@ -17585,7 +17570,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
17585
17570
  }] }];
17586
17571
  } });
17587
17572
 
17588
- const moment$5 = momentImported;
17589
17573
  const AndroidOsEnvironment = Object.freeze({
17590
17574
  DIRECTORY_DOWNLOADS: 'Download',
17591
17575
  DIRECTORY_DOWNLOADS_OLD: 'Downloads', // Old name, for older Android version
@@ -17865,16 +17849,16 @@ class PlatformService extends StartableService {
17865
17849
  }
17866
17850
  // config moment lib
17867
17851
  try {
17868
- moment$5.locale(event.lang);
17852
+ moment.locale(event.lang);
17869
17853
  console.debug('[platform] Use locale {' + event.lang + '}');
17870
17854
  }
17871
17855
  // If error, fallback to en
17872
17856
  catch (err) {
17873
- moment$5.locale('en');
17857
+ moment.locale('en');
17874
17858
  console.warn('[platform] Unknown local for moment lib. Using default [en]');
17875
17859
  }
17876
17860
  // Config date adapter
17877
- this.dateAdapter.setLocale(moment$5.locale());
17861
+ this.dateAdapter.setLocale(moment.locale());
17878
17862
  }
17879
17863
  });
17880
17864
  this.settings.onChange.subscribe(data => {
@@ -25109,7 +25093,6 @@ class AppTable {
25109
25093
  this.defaultPageSize = DEFAULT_PAGE_SIZE;
25110
25094
  this.defaultPageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS;
25111
25095
  this.onRefresh = new EventEmitter();
25112
- this.onOpenIdAndRow = new EventEmitter();
25113
25096
  this.onOpenRow = new EventEmitter();
25114
25097
  this.onNewRow = new EventEmitter();
25115
25098
  this.onStartEditingRow = new EventEmitter();
@@ -25535,8 +25518,8 @@ class AppTable {
25535
25518
  }
25536
25519
  }
25537
25520
  confirmAndAdd(event, row) {
25538
- if (row && !this.confirmEditCreate(event, row)) {
25539
- return false;
25521
+ if (!this.confirmEditCreate(event, row)) {
25522
+ return Promise.resolve(false);
25540
25523
  }
25541
25524
  // Add row
25542
25525
  return this.addRow(event);
@@ -26218,11 +26201,6 @@ class AppTable {
26218
26201
  if (this.debug && this.dirty) {
26219
26202
  console.warn('[table] Opening row details, but table has unsaved changes!');
26220
26203
  }
26221
- if (this.onOpenIdAndRow.observers.length) {
26222
- console.warn('[table] Detected deprecated use of (onOpenIdAndRow). Please use (onOpenRow) instead');
26223
- this.onOpenIdAndRow.emit({ id, row });
26224
- return true;
26225
- }
26226
26204
  if (this.onOpenRow.observers.length) {
26227
26205
  this.onOpenRow.emit(row);
26228
26206
  return true;
@@ -26679,7 +26657,7 @@ class AppTable {
26679
26657
  }
26680
26658
  }
26681
26659
  AppTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AppTable, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
26682
- 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 });
26660
+ 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 });
26683
26661
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AppTable, decorators: [{
26684
26662
  type: Directive
26685
26663
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: undefined }, { type: EntitiesTableDataSource }, { type: undefined }]; }, propDecorators: { settingsId: [{
@@ -26730,8 +26708,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
26730
26708
  type: Input
26731
26709
  }], onRefresh: [{
26732
26710
  type: Output
26733
- }], onOpenIdAndRow: [{
26734
- type: Output
26735
26711
  }], onOpenRow: [{
26736
26712
  type: Output
26737
26713
  }], onNewRow: [{
@@ -28601,7 +28577,6 @@ const SocialErrorCodes = {
28601
28577
  SUBSCRIBE_JOB_PROGRESSION_ERROR: 50010
28602
28578
  };
28603
28579
 
28604
- const moment$4 = momentImported;
28605
28580
  const APP_USER_EVENT_SERVICE = new InjectionToken('UserEventService');
28606
28581
  class AbstractUserEventService extends BaseGraphqlService {
28607
28582
  constructor(graphql, accountService, network, translate, options) {
@@ -28977,7 +28952,7 @@ class AbstractUserEventService extends BaseGraphqlService {
28977
28952
  }
28978
28953
  resetCount() {
28979
28954
  this._countSubject.next(undefined);
28980
- this.resetCountDate = moment$4();
28955
+ this.resetCountDate = moment();
28981
28956
  // restart listening count changes
28982
28957
  this.startListenCountChanges();
28983
28958
  }
@@ -29036,7 +29011,7 @@ class AbstractUserEventService extends BaseGraphqlService {
29036
29011
  if (!userEvents.length)
29037
29012
  return;
29038
29013
  // set read date
29039
- userEvents.forEach(userEvent => userEvent.readDate = moment$4());
29014
+ userEvents.forEach(userEvent => userEvent.readDate = moment());
29040
29015
  // split local/remote entities
29041
29016
  const localEntities = userEvents.filter(EntityUtils.isLocal);
29042
29017
  const remoteEntities = userEvents.filter(EntityUtils.isRemote);
@@ -30891,13 +30866,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
30891
30866
  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" }]
30892
30867
  }], ctorParameters: function () { return [{ type: i1$2.UntypedFormBuilder }]; } });
30893
30868
 
30894
- const moment$3 = momentImported;
30895
30869
  class SwipeTestPage {
30896
30870
  constructor(formBuilder, dateFormatPipe) {
30897
30871
  this.formBuilder = formBuilder;
30898
30872
  this.dateFormatPipe = dateFormatPipe;
30899
30873
  this.$dates = new BehaviorSubject(undefined);
30900
- this._today = moment$3().startOf('day');
30874
+ this._today = moment().startOf('day');
30901
30875
  this.form = formBuilder.group({
30902
30876
  empty: [null, Validators.required],
30903
30877
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -30910,7 +30884,7 @@ class SwipeTestPage {
30910
30884
  ngOnInit() {
30911
30885
  const dates = [];
30912
30886
  for (let d = 0; d < 7; d++) {
30913
- dates[d] = moment$3(this._today).add(d - 3, 'day');
30887
+ dates[d] = moment(this._today).add(d - 3, 'day');
30914
30888
  }
30915
30889
  this.$dates.next(dates);
30916
30890
  this.loadData();
@@ -30947,7 +30921,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
30947
30921
  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" }]
30948
30922
  }], ctorParameters: function () { return [{ type: i1$2.UntypedFormBuilder }, { type: DateFormatPipe }]; } });
30949
30923
 
30950
- const moment$2 = momentImported;
30951
30924
  class DateTimeTestPage {
30952
30925
  constructor(platform, formBuilder, cd) {
30953
30926
  this.platform = platform;
@@ -30981,7 +30954,7 @@ class DateTimeTestPage {
30981
30954
  // Load the form with data
30982
30955
  loadData() {
30983
30956
  return __awaiter(this, void 0, void 0, function* () {
30984
- const now = moment$2();
30957
+ const now = moment();
30985
30958
  const data = {
30986
30959
  empty: null,
30987
30960
  emptyRequired: null,
@@ -31221,7 +31194,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
31221
31194
  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" }]
31222
31195
  }], ctorParameters: function () { return [{ type: i1$2.UntypedFormBuilder }]; } });
31223
31196
 
31224
- const moment$1 = momentImported;
31225
31197
  class DateTestPage {
31226
31198
  constructor(formBuilder, cd) {
31227
31199
  this.formBuilder = formBuilder;
@@ -31254,7 +31226,7 @@ class DateTestPage {
31254
31226
  // Load the form with data
31255
31227
  loadData() {
31256
31228
  return __awaiter(this, void 0, void 0, function* () {
31257
- const now = moment$1();
31229
+ const now = moment();
31258
31230
  const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
31259
31231
  const data = {
31260
31232
  empty: null,
@@ -31384,7 +31356,7 @@ class ObservableTestPage {
31384
31356
  this._stopSubject.next();
31385
31357
  }
31386
31358
  log(message, ...args) {
31387
- let fullMessage = `${toDateISOString(moment$7())} - ${message}`;
31359
+ let fullMessage = `${toDateISOString(moment())} - ${message}`;
31388
31360
  if (args === null || args === void 0 ? void 0 : args.length) {
31389
31361
  fullMessage += ' - <small>' + args.map(JSON.stringify).join(', ') + '</small>';
31390
31362
  }
@@ -32819,7 +32791,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
32819
32791
  }] }];
32820
32792
  } });
32821
32793
 
32822
- const moment = momentImported;
32823
32794
  class UserEventTestingPage {
32824
32795
  constructor(userEventService, router, alertController, translateService) {
32825
32796
  this.userEventService = userEventService;
@@ -33161,5 +33132,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
33161
33132
  * Generated bundle index. Do not edit.
33162
33133
  */
33163
33134
 
33164
- 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 };
33135
+ 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 };
33165
33136
  //# sourceMappingURL=sumaris-net.ngx-components.mjs.map