@sumaris-net/ngx-components 1.13.1 → 1.14.1

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 (36) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +243 -51
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/doc/changelog.md +5 -0
  6. package/esm2015/src/app/core/auth/form/form-auth.js +2 -2
  7. package/esm2015/src/app/core/install/install-upgrade-card.component.js +3 -3
  8. package/esm2015/src/app/core/services/account.service.js +1 -3
  9. package/esm2015/src/app/core/services/base-entity-service.class.js +6 -3
  10. package/esm2015/src/app/core/services/config/core.config.js +7 -1
  11. package/esm2015/src/app/core/services/network.service.js +53 -4
  12. package/esm2015/src/app/core/services/network.utils.js +1 -1
  13. package/esm2015/src/app/core/services/platform.service.js +91 -5
  14. package/esm2015/src/app/shared/http/http.utils.js +14 -2
  15. package/esm2015/src/app/shared/upload-file/upload-file.component.js +12 -7
  16. package/esm2015/src/app/shared/upload-file/upload-file.model.js +8 -1
  17. package/esm2015/src/app/shared/version/versions.js +5 -1
  18. package/esm2015/src/environments/environment.class.js +1 -1
  19. package/fesm2015/sumaris-net.ngx-components.js +185 -17
  20. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  21. package/package.json +1 -1
  22. package/src/app/core/services/config/core.config.d.ts +1 -0
  23. package/src/app/core/services/network.service.d.ts +10 -1
  24. package/src/app/core/services/network.utils.d.ts +15 -0
  25. package/src/app/core/services/platform.service.d.ts +6 -0
  26. package/src/app/shared/http/http.utils.d.ts +1 -0
  27. package/src/app/shared/upload-file/upload-file.model.d.ts +5 -3
  28. package/src/app/shared/version/versions.d.ts +2 -0
  29. package/src/assets/i18n/en-US.json +2 -5
  30. package/src/assets/i18n/en.json +2 -5
  31. package/src/assets/i18n/fr.json +4 -3
  32. package/src/assets/manifest.json +5 -5
  33. package/src/environments/environment.class.d.ts +1 -0
  34. package/src/theme/_responsive.scss +7 -3
  35. package/sumaris-net.ngx-components.metadata.json +1 -1
  36. package/src/assets/manifest.sumaris.json +0 -17
@@ -2,4 +2,4 @@ import { InjectionToken } from '@angular/core';
2
2
  export const ENVIRONMENT = new InjectionToken('ENV');
3
3
  export class Environment {
4
4
  }
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFjLEtBQUssQ0FBQyxDQUFDO0FBRWxFLE1BQU0sT0FBTyxXQUFXO0NBZ0V2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZldGNoUG9saWN5IH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQgeyBTdG9yYWdlQ29uZmlnIH0gZnJvbSAnQGlvbmljL3N0b3JhZ2UnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IEVOVklST05NRU5UID0gbmV3IEluamVjdGlvblRva2VuPEVudmlyb25tZW50PignRU5WJyk7XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBwcm9kdWN0aW9uOiBib29sZWFuO1xuICBiYXNlVXJsOiBzdHJpbmc7XG5cbiAgLy8gQSBwZWVyIHRvIHVzZSBhdCBzdGFydHVwICh1c2VmdWwgb24gYSB3ZWIgc2l0ZSBkZXBsb3ltZW50KVxuICBkZWZhdWx0UGVlcj86IHsgaG9zdDogc3RyaW5nOyBwb3J0OiBudW1iZXI7IHVzZVNzbD86IGJvb2xlYW47IHBhdGg/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbiAgLy8gQSBsaXN0IG9mIHBlZXJzLCB0byBzZWxlY3QgYXMgcGVlciwgaW4gc2V0dGluZ3NcbiAgZGVmYXVsdFBlZXJzPzogeyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlcjsgdXNlU3NsPzogYm9vbGVhbjsgcGF0aD86IHN0cmluZyB9W107XG5cbiAgLy8gTWluIGNvbXBhdGlibGUgdmVyc2lvbiBmb3IgdGhlIHBlZXJcbiAgcGVlck1pblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLy8gRW5hYmxlIGNhY2hlIHBlcnNpc3RlbmNlID9cbiAgcGVyc2lzdENhY2hlPzogYm9vbGVhbjtcblxuICAvLyBGb3JjZSBvZmZsaW5lIG1vZGUgPyAvIVxcIEZvciBERVYgb25seVxuICBvZmZsaW5lPzogYm9vbGVhbjtcblxuICAvLyBBcG9sbG8gKGdyYXBoUUwpIGNvbmZpZ1xuICBhcG9sbG9GZXRjaFBvbGljeT86ICBGZXRjaFBvbGljeTtcblxuICAvLyBEZWZhdWx0IHZhbHVlc1xuICBkZWZhdWx0TG9jYWxlOiBzdHJpbmc7XG4gIGRlZmF1bHRMYXRMb25nRm9ybWF0PzogJ0REJyB8ICdERE1NJyB8ICdERE1NU1MnO1xuICBkZWZhdWx0RGVwYXJ0bWVudElkPzogbnVtYmVyO1xuICBkZWZhdWx0QXBwTmFtZT86IHN0cmluZztcbiAgZGVmYXVsdEFuZHJvaWRJbnN0YWxsVXJsPzogc3RyaW5nO1xuXG4gIC8vIFN0b3JhZ2VcbiAgc3RvcmFnZT86IFBhcnRpYWw8U3RvcmFnZUNvbmZpZz47XG4gIHN0b3JhZ2VTYXZlUGVyaW9kTXM/OiBudW1iZXI7XG5cbiAgLy8gQWJvdXRcbiAgc291cmNlVXJsPzogc3RyaW5nO1xuICByZXBvcnRJc3N1ZVVybD86IHN0cmluZztcbiAgZm9ydW1Vcmw/OiBzdHJpbmc7XG4gIGhlbHBVcmw/OiBzdHJpbmc7XG5cbiAgLy8gRGVmYXVsdCBhdXRoZW50aWNhdGlvbiAvIVxcIEZvciBERVYgb25seVxuICAvLyAoc2VlIHZhbHVlcyBpbiB0aGUgdGVzdCBkYXRhYmFzZSAtIFhNTCBmaWxlcyBpbiBQb2QncyBtb2R1bGUpXG4gIGRlZmF1bHRBdXRoVmFsdWVzPzoge1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICB9O1xuXG4gIC8vIEFjY291bnRcbiAgYWNjb3VudD86IHtcbiAgICBzaG93QWNjb3VudEJ1dHRvbj86IGJvb2xlYW47IC8vIFNob3cgYWNjb3VudCBidXR0b24gaW4gaG9tZSBwYWdlIChpZiB1bmRlZmluZWQgPSB0cnVlKVxuICAgIGVuYWJsZUxpc3RlbkNoYW5nZXM/OiBib29sZWFuO1xuICAgIC8vIElmIHVuZGVmaW5lZCBvciAwLCB0aGVuIGxpc3RlbiBvbmx5IGNoYW5nZXMgbWFkZSBieSB0aGUgcG9kXG4gICAgLy8gSWYgZ3JlYXRlciB0aGFuIDAgOiB3aWxsIGNoZWNrIGNvbmN1cnJlbnQgY2hhbmdlcyBpbiB0aGUgREIgKGUuZy4gY2hhbmdlcyBtZGUgYnkgYW5vdGhlciBzb2Z0d2FyZSkgQU5EIGNoYW5nZXMgbWFkZSB0aGUgcG9kXG4gICAgbGlzdGVuSW50ZXJ2YWxJblNlY29uZHM/OiBudW1iZXI7XG4gIH07XG5cbiAgZW50aXR5RWRpdG9yPzoge1xuICAgIGVuYWJsZUxpc3RlbkNoYW5nZXM/OiBib29sZWFuO1xuICAgIC8vIElmIHVuZGVmaW5lZCBvciAwLCB0aGVuIGxpc3RlbiBvbmx5IGNoYW5nZXMgbWFkZSBieSB0aGUgcG9kXG4gICAgLy8gSWYgZ3JlYXRlciB0aGFuIDAgOiB3aWxsIGNoZWNrIGNvbmN1cnJlbnQgY2hhbmdlcyBpbiB0aGUgREIgKGUuZy4gY2hhbmdlcyBtZGUgYnkgYW5vdGhlciBzb2Z0d2FyZSkgQU5EIGNoYW5nZXMgbWFkZSB0aGUgcG9kXG4gICAgbGlzdGVuSW50ZXJ2YWxJblNlY29uZHM/OiBudW1iZXI7XG4gIH07XG5cbn1cbiJdfQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFjLEtBQUssQ0FBQyxDQUFDO0FBRWxFLE1BQU0sT0FBTyxXQUFXO0NBbUV2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZldGNoUG9saWN5IH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQgeyBTdG9yYWdlQ29uZmlnIH0gZnJvbSAnQGlvbmljL3N0b3JhZ2UnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IEVOVklST05NRU5UID0gbmV3IEluamVjdGlvblRva2VuPEVudmlyb25tZW50PignRU5WJyk7XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBwcm9kdWN0aW9uOiBib29sZWFuO1xuICBiYXNlVXJsOiBzdHJpbmc7XG5cbiAgLy8gQSBwZWVyIHRvIHVzZSBhdCBzdGFydHVwICh1c2VmdWwgb24gYSB3ZWIgc2l0ZSBkZXBsb3ltZW50KVxuICBkZWZhdWx0UGVlcj86IHsgaG9zdDogc3RyaW5nOyBwb3J0OiBudW1iZXI7IHVzZVNzbD86IGJvb2xlYW47IHBhdGg/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbiAgLy8gQSBsaXN0IG9mIHBlZXJzLCB0byBzZWxlY3QgYXMgcGVlciwgaW4gc2V0dGluZ3NcbiAgZGVmYXVsdFBlZXJzPzogeyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlcjsgdXNlU3NsPzogYm9vbGVhbjsgcGF0aD86IHN0cmluZyB9W107XG5cbiAgLy8gTWluIGNvbXBhdGlibGUgdmVyc2lvbiBmb3IgdGhlIHBlZXJcbiAgcGVlck1pblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLy8gSW50ZXJ2YWwgdG8gY2hlY2sgaWYgd2ViIHBhZ2UgbXVzdCBiZSByZWxvYWQsIGluIG1pbGxpc1xuICBjaGVja0FwcFZlcnNpb25JbnRlcnZhbEluU2Vjb25kcz86IG51bWJlcjtcblxuICAvLyBFbmFibGUgY2FjaGUgcGVyc2lzdGVuY2UgP1xuICBwZXJzaXN0Q2FjaGU/OiBib29sZWFuO1xuXG4gIC8vIEZvcmNlIG9mZmxpbmUgbW9kZSA/IC8hXFwgRm9yIERFViBvbmx5XG4gIG9mZmxpbmU/OiBib29sZWFuO1xuXG4gIC8vIEFwb2xsbyAoZ3JhcGhRTCkgY29uZmlnXG4gIGFwb2xsb0ZldGNoUG9saWN5PzogIEZldGNoUG9saWN5O1xuXG4gIC8vIERlZmF1bHQgdmFsdWVzXG4gIGRlZmF1bHRMb2NhbGU6IHN0cmluZztcbiAgZGVmYXVsdExhdExvbmdGb3JtYXQ/OiAnREQnIHwgJ0RETU0nIHwgJ0RETU1TUyc7XG4gIGRlZmF1bHREZXBhcnRtZW50SWQ/OiBudW1iZXI7XG4gIGRlZmF1bHRBcHBOYW1lPzogc3RyaW5nO1xuICBkZWZhdWx0QW5kcm9pZEluc3RhbGxVcmw/OiBzdHJpbmc7XG5cbiAgLy8gU3RvcmFnZVxuICBzdG9yYWdlPzogUGFydGlhbDxTdG9yYWdlQ29uZmlnPjtcbiAgc3RvcmFnZVNhdmVQZXJpb2RNcz86IG51bWJlcjtcblxuICAvLyBBYm91dFxuICBzb3VyY2VVcmw/OiBzdHJpbmc7XG4gIHJlcG9ydElzc3VlVXJsPzogc3RyaW5nO1xuICBmb3J1bVVybD86IHN0cmluZztcbiAgaGVscFVybD86IHN0cmluZztcblxuICAvLyBEZWZhdWx0IGF1dGhlbnRpY2F0aW9uIC8hXFwgRm9yIERFViBvbmx5XG4gIC8vIChzZWUgdmFsdWVzIGluIHRoZSB0ZXN0IGRhdGFiYXNlIC0gWE1MIGZpbGVzIGluIFBvZCdzIG1vZHVsZSlcbiAgZGVmYXVsdEF1dGhWYWx1ZXM/OiB7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIH07XG5cbiAgLy8gQWNjb3VudFxuICBhY2NvdW50Pzoge1xuICAgIHNob3dBY2NvdW50QnV0dG9uPzogYm9vbGVhbjsgLy8gU2hvdyBhY2NvdW50IGJ1dHRvbiBpbiBob21lIHBhZ2UgKGlmIHVuZGVmaW5lZCA9IHRydWUpXG4gICAgZW5hYmxlTGlzdGVuQ2hhbmdlcz86IGJvb2xlYW47XG4gICAgLy8gSWYgdW5kZWZpbmVkIG9yIDAsIHRoZW4gbGlzdGVuIG9ubHkgY2hhbmdlcyBtYWRlIGJ5IHRoZSBwb2RcbiAgICAvLyBJZiBncmVhdGVyIHRoYW4gMCA6IHdpbGwgY2hlY2sgY29uY3VycmVudCBjaGFuZ2VzIGluIHRoZSBEQiAoZS5nLiBjaGFuZ2VzIG1kZSBieSBhbm90aGVyIHNvZnR3YXJlKSBBTkQgY2hhbmdlcyBtYWRlIHRoZSBwb2RcbiAgICBsaXN0ZW5JbnRlcnZhbEluU2Vjb25kcz86IG51bWJlcjtcbiAgfTtcblxuICBlbnRpdHlFZGl0b3I/OiB7XG4gICAgZW5hYmxlTGlzdGVuQ2hhbmdlcz86IGJvb2xlYW47XG4gICAgLy8gSWYgdW5kZWZpbmVkIG9yIDAsIHRoZW4gbGlzdGVuIG9ubHkgY2hhbmdlcyBtYWRlIGJ5IHRoZSBwb2RcbiAgICAvLyBJZiBncmVhdGVyIHRoYW4gMCA6IHdpbGwgY2hlY2sgY29uY3VycmVudCBjaGFuZ2VzIGluIHRoZSBEQiAoZS5nLiBjaGFuZ2VzIG1kZSBieSBhbm90aGVyIHNvZnR3YXJlKSBBTkQgY2hhbmdlcyBtYWRlIHRoZSBwb2RcbiAgICBsaXN0ZW5JbnRlcnZhbEluU2Vjb25kcz86IG51bWJlcjtcbiAgfTtcblxufVxuIl19
@@ -9979,7 +9979,18 @@ class HttpUtils {
9979
9979
  static getResource(http, uri, opts) {
9980
9980
  return __awaiter(this, void 0, void 0, function* () {
9981
9981
  // Add headers
9982
- opts = Object.assign({}, opts);
9982
+ opts = Object.assign({}, opts
9983
+ //headers: new HttpHeaders(),
9984
+ //.append('X-App-Name', environment.name)
9985
+ //.append('X-App-Version', environment.version),
9986
+ );
9987
+ // Force no cache
9988
+ if (opts.nocache === true) {
9989
+ opts.headers = (opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers));
9990
+ opts.headers
9991
+ .append('Cache-Control', 'no-cache')
9992
+ .append('Pragma', 'no-cache');
9993
+ }
9983
9994
  try {
9984
9995
  // Using web http client
9985
9996
  return (yield http.get(uri, opts).toPromise());
@@ -10021,6 +10032,7 @@ class VersionUtils {
10021
10032
  }
10022
10033
  VersionUtils.compare = compareVersionNumbers;
10023
10034
  VersionUtils.isCompatible = isVersionCompatible;
10035
+ VersionUtils.isSame = isSameVersion;
10024
10036
  /**
10025
10037
  * Compare two software version numbers (e.g. 1.7.1)
10026
10038
  * Returns:
@@ -10089,6 +10101,9 @@ function isVersionCompatible(minVersion, actualVersion) {
10089
10101
  //console.debug(`[http] Checking actual version {${actualVersion}} is compatible with min expected version {${minVersion}}`);
10090
10102
  return compareVersionNumbers(minVersion, actualVersion) <= 0;
10091
10103
  }
10104
+ function isSameVersion(v1, v2) {
10105
+ return compareVersionNumbers(v1, v2) === 0;
10106
+ }
10092
10107
 
10093
10108
  class SelectPeerModal {
10094
10109
  constructor(viewCtrl, cd, http, environment) {
@@ -11020,15 +11035,65 @@ class NetworkService extends StartableService {
11020
11035
  });
11021
11036
  }
11022
11037
  getNodeInfo(peer) {
11038
+ const path = this.computePeerPath(peer, '/api/node/info');
11039
+ return this.get(path);
11040
+ }
11041
+ getAppManifest(peer, opts) {
11042
+ return __awaiter(this, void 0, void 0, function* () {
11043
+ try {
11044
+ let path = this.computePeerPath(peer, 'manifest.json');
11045
+ if (opts === null || opts === void 0 ? void 0 : opts.nocache) {
11046
+ path += '?t=' + Date.now();
11047
+ }
11048
+ return yield this.get(path, opts);
11049
+ }
11050
+ catch (err) {
11051
+ if (this.environment.production)
11052
+ console.error('[network] Cannot load file \'manifest.json\'. Please make sure webserver config allow CORS access', err);
11053
+ else
11054
+ console.error('[network] Cannot load file \'manifest.json\'.', err);
11055
+ // Continue
11056
+ }
11057
+ });
11058
+ }
11059
+ getAppVersion(peer, opts) {
11060
+ return __awaiter(this, void 0, void 0, function* () {
11061
+ try {
11062
+ let path = this.computePeerPath(peer, 'version.appup');
11063
+ if (opts === null || opts === void 0 ? void 0 : opts.nocache) {
11064
+ path += '?t=' + Date.now();
11065
+ }
11066
+ const appVersion = yield this.get(path, opts);
11067
+ if (isNotNilOrBlank(appVersion))
11068
+ return appVersion;
11069
+ }
11070
+ catch (err) {
11071
+ if (this.environment.production)
11072
+ console.error('[network] Cannot load file \'version.appup\'. Please make sure webserver config allow CORS access');
11073
+ else
11074
+ console.error('[network] Cannot load file \'version.appup\'.', err);
11075
+ // Continue
11076
+ }
11077
+ // Try loading manifest.json
11078
+ const manifest = yield this.getAppManifest(peer, opts);
11079
+ return manifest === null || manifest === void 0 ? void 0 : manifest.version;
11080
+ });
11081
+ }
11082
+ computePeerPath(peer, path) {
11023
11083
  peer = peer || this.peer;
11024
11084
  if (!peer)
11025
11085
  return undefined;
11026
- let peerUrl = isInstanceOf(peer, Peer) ? peer.url : peer;
11086
+ let peerUrl = (peer instanceof Peer) ? peer.url : peer;
11027
11087
  // Remove trailing slash
11028
11088
  if (peerUrl.endsWith('/')) {
11029
11089
  peerUrl = peerUrl.substr(0, peerUrl.length - 1);
11030
11090
  }
11031
- return this.get(peerUrl + '/api/node/info');
11091
+ // Add first path
11092
+ if (!path.startsWith('/')) {
11093
+ path = '/' + path;
11094
+ }
11095
+ // Concat peer URL and path
11096
+ return peerUrl + path;
11032
11097
  }
11033
11098
  /**
11034
11099
  * Allow to force offline mode
@@ -13951,8 +14016,6 @@ class AccountService extends BaseGraphqlService {
13951
14016
  }
13952
14017
  canUserWriteDataForDepartment(recorderDepartment) {
13953
14018
  if (ReferentialUtils.isEmpty(recorderDepartment)) {
13954
- if (!this.isAdmin())
13955
- console.warn('Unable to check if user has right: invalid recorderDepartment', recorderDepartment);
13956
14019
  return this.isAdmin();
13957
14020
  }
13958
14021
  // Should be login, and status ENABLE
@@ -15037,6 +15100,12 @@ const CORE_CONFIG_OPTIONS = Object.freeze({
15037
15100
  key: 'sumaris.android.install.url',
15038
15101
  label: 'CONFIGURATION.OPTIONS.ANDROID_INSTALL_URL',
15039
15102
  type: 'string'
15103
+ },
15104
+ DB_TIMEZONE: {
15105
+ key: 'sumaris.persistence.db.timezone',
15106
+ label: 'DB Timezone (readonly)',
15107
+ type: 'string',
15108
+ isTransient: true // ONly on server, cannot be set
15040
15109
  }
15041
15110
  });
15042
15111
 
@@ -15455,6 +15524,9 @@ class PlatformService extends StartableService {
15455
15524
  isApp() {
15456
15525
  return this._cordova && (this._android || this._ios);
15457
15526
  }
15527
+ isMobileWeb() {
15528
+ return isMobile(window) && this.isWeb();
15529
+ }
15458
15530
  get canDownload() {
15459
15531
  return !!this.downloader && this.isAndroidCordova();
15460
15532
  }
@@ -15468,6 +15540,7 @@ class PlatformService extends StartableService {
15468
15540
  return this.platform.height();
15469
15541
  }
15470
15542
  ngOnStart() {
15543
+ var _a;
15471
15544
  return __awaiter(this, void 0, void 0, function* () {
15472
15545
  const now = Date.now();
15473
15546
  this.accountService.tokenType = undefined;
@@ -15493,11 +15566,16 @@ class PlatformService extends StartableService {
15493
15566
  this.networkService.ready(),
15494
15567
  this.audioProvider.ready()
15495
15568
  ]);
15496
- console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
15569
+ // Check if web app has update, and reload page if need
15570
+ if (this.isWeb() && this.environment.production) {
15571
+ yield this.checkAppVersion({ canReload: true });
15572
+ }
15497
15573
  // Update cache configuration when network changed
15498
15574
  this.networkService.onNetworkStatusChanges
15499
- .pipe(skip(1)) // Skip the first event (behavior subject send event immediately)
15575
+ .pipe(skip(1) // Olready done once, so we skip the first event
15576
+ )
15500
15577
  .subscribe(type => this.configureCache(type !== 'none'));
15578
+ console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, web: ${this.isWeb()}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
15501
15579
  // Update authentication type
15502
15580
  this.configService.config
15503
15581
  .pipe(map(config => config === null || config === void 0 ? void 0 : config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE)), filter(isNotNilOrBlank), distinctUntilChanged())
@@ -15514,6 +15592,14 @@ class PlatformService extends StartableService {
15514
15592
  this.audioProvider.playStartupSound();
15515
15593
  }, 1000);
15516
15594
  }
15595
+ // Check if new version, every 1 min
15596
+ const checkIntervalMs = (this.environment.checkAppVersionIntervalInSeconds || 0) * 1000;
15597
+ if (this.isWeb() && this.environment.production && checkIntervalMs > 0) {
15598
+ (_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe();
15599
+ this.checkAppVersionTimer = timer(checkIntervalMs, checkIntervalMs)
15600
+ .subscribe(_ => this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ }));
15601
+ this.registerSubscription(this.checkAppVersionTimer);
15602
+ }
15517
15603
  }
15518
15604
  catch (err) {
15519
15605
  // Manage startup error
@@ -15635,6 +15721,74 @@ class PlatformService extends StartableService {
15635
15721
  this.cache.setDefaultTTL(cacheTTL);
15636
15722
  this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline
15637
15723
  }
15724
+ checkAppVersion(opts) {
15725
+ var _a, _b, _c;
15726
+ return __awaiter(this, void 0, void 0, function* () {
15727
+ if (this.networkService.offline || !this.isWeb())
15728
+ return; // Skip
15729
+ const silent = (opts === null || opts === void 0 ? void 0 : opts.silent) === true;
15730
+ const production = this.environment.production;
15731
+ const canAutoReload = !opts || opts.canReload !== false;
15732
+ if (!silent)
15733
+ console.info('[platform] Checking remote app version...');
15734
+ const actualVersion = this.environment.version;
15735
+ if (isNilOrBlank(actualVersion)) {
15736
+ console.error('[platform] Missing required value for \'environment.version\'. Cannot check remote app version.');
15737
+ (_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe(); // Stop timer if exists
15738
+ return; // Skip
15739
+ }
15740
+ const peer = undefined; // location.origin + this.environment.baseUrl;
15741
+ const remoteVersion = yield this.networkService.getAppVersion(peer);
15742
+ if (isNilOrBlank(remoteVersion)) {
15743
+ if (production && !silent)
15744
+ console.error('[platform] Cannot load remote app version. Skipping version check');
15745
+ (_b = this.checkAppVersionTimer) === null || _b === void 0 ? void 0 : _b.unsubscribe(); // Stop timer if exists
15746
+ return;
15747
+ }
15748
+ if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
15749
+ if (!silent)
15750
+ console.info('[platform] Checking remote app version [OK]');
15751
+ return;
15752
+ }
15753
+ // If newer version exists
15754
+ let reloadPath = location.href.replace(/[&]?version=[0-9.]+/gi, ''); // Remove old version in query params
15755
+ reloadPath += (reloadPath.indexOf('?') === -1) ? '?' : '&'; // Add query param separator
15756
+ reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)
15757
+ // Already try to reload, but version still bad
15758
+ if (reloadPath === location.href) {
15759
+ if (canAutoReload)
15760
+ console.error(`[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: ${actualVersion})`);
15761
+ // Stop timer, to avoid infinite loop
15762
+ (_c = this.checkAppVersionTimer) === null || _c === void 0 ? void 0 : _c.unsubscribe();
15763
+ return;
15764
+ }
15765
+ console.warn(`[platform] More recent version detected (remote: ${remoteVersion}, actual: ${actualVersion}`);
15766
+ // Auto reload
15767
+ if (canAutoReload) {
15768
+ console.info('[platform] Will reloading at ' + reloadPath);
15769
+ location.href = reloadPath;
15770
+ // App stop
15771
+ }
15772
+ // Ask user to reload
15773
+ else {
15774
+ yield this.showToast({
15775
+ message: 'CONFIRM.RELOAD_APP',
15776
+ messageParams: { version: remoteVersion, name: this.environment.name },
15777
+ type: 'info', duration: -1,
15778
+ buttons: [
15779
+ // Reload button
15780
+ { text: this.translate.instant('COMMON.BTN_RELOAD'),
15781
+ side: 'end',
15782
+ handler: () => {
15783
+ location.href = reloadPath;
15784
+ return true;
15785
+ }
15786
+ }
15787
+ ]
15788
+ });
15789
+ }
15790
+ });
15791
+ }
15638
15792
  storageReady() {
15639
15793
  return __awaiter(this, void 0, void 0, function* () {
15640
15794
  console.info(`[platform] Starting storage...`);
@@ -15850,6 +16004,13 @@ class FileResponse {
15850
16004
  this.statusText = (init === null || init === void 0 ? void 0 : init.statusText) || 'OK';
15851
16005
  }
15852
16006
  }
16007
+ function isProgressEvent(event) {
16008
+ return event.type === HttpEventType.UploadProgress
16009
+ || event.type === HttpEventType.DownloadProgress;
16010
+ }
16011
+ function isResponseEvent(event) {
16012
+ return event.type === HttpEventType.Response;
16013
+ }
15853
16014
 
15854
16015
  class UploadFileComponent {
15855
16016
  constructor(cd, translate) {
@@ -15985,7 +16146,7 @@ class UploadFileComponent {
15985
16146
  switchMap(file => this.uploadFn(file)
15986
16147
  .pipe(map((event) => {
15987
16148
  // Progress event
15988
- if ((event === null || event === void 0 ? void 0 : event.type) === HttpEventType.UploadProgress || event.type === HttpEventType.User) {
16149
+ if (isProgressEvent(event)) {
15989
16150
  if (isNotNil(event.loaded) && event.loaded >= 0) {
15990
16151
  file.progress = Math.min(1, event.loaded / (event.total || 1));
15991
16152
  }
@@ -15993,15 +16154,20 @@ class UploadFileComponent {
15993
16154
  file.progress = -1; // Indeterminate progression
15994
16155
  }
15995
16156
  }
16157
+ // User event
16158
+ else if (event.type === HttpEventType.User) {
16159
+ file.progress = -1; // Indeterminate progression
16160
+ }
15996
16161
  // Response event
15997
- else if (event instanceof HttpResponse || event instanceof FileResponse) {
16162
+ else if (isResponseEvent(event)) {
15998
16163
  file.progress = 1;
15999
16164
  file.response = event;
16000
16165
  console.debug(`[upload-file] ${file.name}: ${event.statusText || 'OK'}`, file.response);
16001
16166
  }
16002
- // Other events
16167
+ // Other events: ignore
16003
16168
  else {
16004
- console.warn('[upload-file] Unknown event, returned by uploadFn\'s observable:', event);
16169
+ // DEBUG
16170
+ console.debug('[upload-file] Ignoring a file event: ', event);
16005
16171
  }
16006
16172
  return file;
16007
16173
  }), catchError((err) => {
@@ -17810,7 +17976,7 @@ class AuthForm extends AppForm {
17810
17976
  this.showPwd = false;
17811
17977
  this.onCancel = new EventEmitter();
17812
17978
  this.onSubmit = new EventEmitter();
17813
- this.mobile = platform.mobile;
17979
+ this.mobile = settings.mobile;
17814
17980
  this.canWorkOffline = this.settings.hasOfflineFeature();
17815
17981
  this._enable = true;
17816
17982
  }
@@ -19872,10 +20038,10 @@ class AppInstallUpgradeCard {
19872
20038
  }
19873
20039
  getCompatibleInstallLinks(installLinks) {
19874
20040
  // Cordova already running: not need to install
19875
- if (this.platform.is('cordova'))
20041
+ if (this.platform.isCordova())
19876
20042
  return undefined;
19877
20043
  // If mobile web: return all
19878
- if (this.platform.is('mobileweb')) {
20044
+ if (this.platform.isMobileWeb()) {
19879
20045
  return installLinks;
19880
20046
  }
19881
20047
  return undefined;
@@ -21038,8 +21204,10 @@ class BaseEntityService extends BaseGraphqlService {
21038
21204
  listenChanges(id, opts) {
21039
21205
  if (isNil(id))
21040
21206
  throw Error('Missing argument \'id\' ');
21041
- if (!this.subscriptions.listenChanges)
21042
- throw Error('Not implemented!');
21207
+ if (!this.subscriptions.listenChanges) {
21208
+ console.warn(`${this.constructor.name}.listenChanges() not implemented yet. Will empty observable`);
21209
+ return of();
21210
+ }
21043
21211
  const variables = opts && opts.variables || {
21044
21212
  id,
21045
21213
  interval: toNumber(opts && opts.interval, 0) // no timer by default
@@ -26625,5 +26793,5 @@ CoreTestingModule.decorators = [
26625
26793
  * Generated bundle index. Do not edit.
26626
26794
  */
26627
26795
 
26628
- export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetPipe, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isControlHasInput, isCordova, isDesktop, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isTouchUi, isWindow, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0$b as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppIconComponent as ɵi, NumpadTestPage as ɵj, MatBadgeIconTestPage as ɵk, ToastTestingModule as ɵl, ToastTestingPage as ɵm };
26796
+ export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetPipe, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isControlHasInput, isCordova, isDesktop, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindow, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0$b as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppIconComponent as ɵi, NumpadTestPage as ɵj, MatBadgeIconTestPage as ɵk, ToastTestingModule as ɵl, ToastTestingPage as ɵm };
26629
26797
  //# sourceMappingURL=sumaris-net.ngx-components.js.map