@sumaris-net/ngx-components 1.13.2 → 1.14.0

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 (33) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +237 -48
  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 +3 -0
  6. package/esm2015/src/app/core/services/account.service.js +1 -3
  7. package/esm2015/src/app/core/services/config/core.config.js +7 -1
  8. package/esm2015/src/app/core/services/network.service.js +53 -4
  9. package/esm2015/src/app/core/services/network.utils.js +1 -1
  10. package/esm2015/src/app/core/services/platform.service.js +92 -8
  11. package/esm2015/src/app/shared/http/http.utils.js +14 -2
  12. package/esm2015/src/app/shared/upload-file/upload-file.component.js +12 -7
  13. package/esm2015/src/app/shared/upload-file/upload-file.model.js +8 -1
  14. package/esm2015/src/app/shared/version/versions.js +5 -1
  15. package/esm2015/src/environments/environment.class.js +1 -1
  16. package/fesm2015/sumaris-net.ngx-components.js +178 -14
  17. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  18. package/package.json +1 -1
  19. package/src/app/core/services/config/core.config.d.ts +1 -0
  20. package/src/app/core/services/network.service.d.ts +10 -1
  21. package/src/app/core/services/network.utils.d.ts +15 -0
  22. package/src/app/core/services/platform.service.d.ts +5 -0
  23. package/src/app/shared/http/http.utils.d.ts +1 -0
  24. package/src/app/shared/upload-file/upload-file.model.d.ts +5 -3
  25. package/src/app/shared/version/versions.d.ts +2 -0
  26. package/src/assets/i18n/en-US.json +2 -5
  27. package/src/assets/i18n/en.json +2 -5
  28. package/src/assets/i18n/fr.json +2 -1
  29. package/src/assets/manifest.json +5 -5
  30. package/src/environments/environment.class.d.ts +1 -0
  31. package/src/theme/_responsive.scss +7 -3
  32. package/sumaris-net.ngx-components.metadata.json +1 -1
  33. 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
 
@@ -15471,6 +15540,7 @@ class PlatformService extends StartableService {
15471
15540
  return this.platform.height();
15472
15541
  }
15473
15542
  ngOnStart() {
15543
+ var _a, _b;
15474
15544
  return __awaiter(this, void 0, void 0, function* () {
15475
15545
  const now = Date.now();
15476
15546
  this.accountService.tokenType = undefined;
@@ -15491,16 +15561,22 @@ class PlatformService extends StartableService {
15491
15561
  // Start root services
15492
15562
  yield Promise.all([
15493
15563
  this.entitiesStorage.ready(),
15494
- this.cache.ready().then(() => this.configureCache()),
15564
+ this.cache.ready(),
15495
15565
  this.settings.ready(),
15496
15566
  this.networkService.ready(),
15497
15567
  this.audioProvider.ready()
15498
15568
  ]);
15499
- console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
15569
+ yield Promise.all([
15570
+ this.configureCache(),
15571
+ this.checkAppVersion({ canReload: true })
15572
+ ]);
15500
15573
  // Update cache configuration when network changed
15501
15574
  this.networkService.onNetworkStatusChanges
15502
- .pipe(skip(1)) // Skip the first event (behavior subject send event immediately)
15503
- .subscribe(type => this.configureCache(type !== 'none'));
15575
+ .pipe(skip(1), map(type => type !== 'none'), debounceTime(1000), distinctUntilChanged(),
15576
+ // Configure the cache
15577
+ tap(online => this.configureCache(online)))
15578
+ .subscribe();
15579
+ console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, web: ${this.isWeb()}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
15504
15580
  // Update authentication type
15505
15581
  this.configService.config
15506
15582
  .pipe(map(config => config === null || config === void 0 ? void 0 : config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE)), filter(isNotNilOrBlank), distinctUntilChanged())
@@ -15517,6 +15593,15 @@ class PlatformService extends StartableService {
15517
15593
  this.audioProvider.playStartupSound();
15518
15594
  }, 1000);
15519
15595
  }
15596
+ // Check if new version, every 1 min
15597
+ if (this.isWeb()) {
15598
+ const intervalMs = (((_a = this.environment) === null || _a === void 0 ? void 0 : _a.checkAppVersionIntervalInSeconds) || 0) * 1000;
15599
+ if (intervalMs > 0) {
15600
+ (_b = this.checkAppVersionTimer) === null || _b === void 0 ? void 0 : _b.unsubscribe();
15601
+ this.checkAppVersionTimer = timer(intervalMs, intervalMs)
15602
+ .subscribe(_ => this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ }));
15603
+ }
15604
+ }
15520
15605
  }
15521
15606
  catch (err) {
15522
15607
  // Manage startup error
@@ -15638,6 +15723,73 @@ class PlatformService extends StartableService {
15638
15723
  this.cache.setDefaultTTL(cacheTTL);
15639
15724
  this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline
15640
15725
  }
15726
+ checkAppVersion(opts) {
15727
+ var _a, _b, _c;
15728
+ return __awaiter(this, void 0, void 0, function* () {
15729
+ if (this.networkService.offline || !this.isWeb())
15730
+ return; // Skip
15731
+ const silent = (opts === null || opts === void 0 ? void 0 : opts.silent) === true;
15732
+ const production = this.environment.production;
15733
+ if (!silent)
15734
+ console.info('[platform] Checking remote app version...');
15735
+ const actualVersion = this.environment.version;
15736
+ if (isNilOrBlank(actualVersion)) {
15737
+ console.warn('[platform] Missing required value for \'environment.version\'. Cannot check remote app version.');
15738
+ (_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe(); // Stop timer if exists
15739
+ return; // Skip
15740
+ }
15741
+ const peer = undefined; // location.origin + this.environment.baseUrl;
15742
+ const remoteVersion = yield this.networkService.getAppVersion(peer);
15743
+ if (isNilOrBlank(remoteVersion)) {
15744
+ if (production && !silent)
15745
+ console.error('[platform] Cannot load remote app version. Skipping version check');
15746
+ (_b = this.checkAppVersionTimer) === null || _b === void 0 ? void 0 : _b.unsubscribe(); // Stop timer if exists
15747
+ return;
15748
+ }
15749
+ if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
15750
+ if (!silent)
15751
+ console.info('[platform] Checking remote app version [OK]');
15752
+ return;
15753
+ }
15754
+ // If newer version exists
15755
+ const canAutoReload = !opts || opts.canReload !== false;
15756
+ // Avoid infinite loop, if already reloaded
15757
+ if (location.href.indexOf('?version=' + remoteVersion) !== -1) {
15758
+ if (canAutoReload)
15759
+ console.error(`[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: ${actualVersion})`);
15760
+ (_c = this.checkAppVersionTimer) === null || _c === void 0 ? void 0 : _c.unsubscribe();
15761
+ return;
15762
+ }
15763
+ console.warn(`[platform] More recent version detected (remote: ${remoteVersion}, actual: ${actualVersion}`);
15764
+ let reloadPath = location.href.replace(/[&?]{1}[a-z_-]=[0-9.]+/gi, ''); // Remove query params
15765
+ reloadPath += (reloadPath.indexOf('?') === -1) ? '?' : '&'; // Add query param separator
15766
+ reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)
15767
+ console.info('[platform] Will reloading at ' + reloadPath);
15768
+ // Auto reload
15769
+ if (canAutoReload) {
15770
+ location.href = reloadPath;
15771
+ // App stop
15772
+ }
15773
+ // Ask user to reload
15774
+ else {
15775
+ yield this.showToast({
15776
+ message: 'CONFIRM.RELOAD_APP',
15777
+ messageParams: { version: remoteVersion, name: this.environment.name },
15778
+ type: 'info', duration: -1,
15779
+ buttons: [
15780
+ // Reload button
15781
+ { text: this.translate.instant('COMMON.BTN_RELOAD'),
15782
+ side: 'end',
15783
+ handler: () => {
15784
+ location.href = reloadPath;
15785
+ return true;
15786
+ }
15787
+ }
15788
+ ]
15789
+ });
15790
+ }
15791
+ });
15792
+ }
15641
15793
  storageReady() {
15642
15794
  return __awaiter(this, void 0, void 0, function* () {
15643
15795
  console.info(`[platform] Starting storage...`);
@@ -15853,6 +16005,13 @@ class FileResponse {
15853
16005
  this.statusText = (init === null || init === void 0 ? void 0 : init.statusText) || 'OK';
15854
16006
  }
15855
16007
  }
16008
+ function isProgressEvent(event) {
16009
+ return event.type === HttpEventType.UploadProgress
16010
+ || event.type === HttpEventType.DownloadProgress;
16011
+ }
16012
+ function isResponseEvent(event) {
16013
+ return event.type === HttpEventType.Response;
16014
+ }
15856
16015
 
15857
16016
  class UploadFileComponent {
15858
16017
  constructor(cd, translate) {
@@ -15988,7 +16147,7 @@ class UploadFileComponent {
15988
16147
  switchMap(file => this.uploadFn(file)
15989
16148
  .pipe(map((event) => {
15990
16149
  // Progress event
15991
- if ((event === null || event === void 0 ? void 0 : event.type) === HttpEventType.UploadProgress || event.type === HttpEventType.User) {
16150
+ if (isProgressEvent(event)) {
15992
16151
  if (isNotNil(event.loaded) && event.loaded >= 0) {
15993
16152
  file.progress = Math.min(1, event.loaded / (event.total || 1));
15994
16153
  }
@@ -15996,15 +16155,20 @@ class UploadFileComponent {
15996
16155
  file.progress = -1; // Indeterminate progression
15997
16156
  }
15998
16157
  }
16158
+ // User event
16159
+ else if (event.type === HttpEventType.User) {
16160
+ file.progress = -1; // Indeterminate progression
16161
+ }
15999
16162
  // Response event
16000
- else if (event instanceof HttpResponse || event instanceof FileResponse) {
16163
+ else if (isResponseEvent(event)) {
16001
16164
  file.progress = 1;
16002
16165
  file.response = event;
16003
16166
  console.debug(`[upload-file] ${file.name}: ${event.statusText || 'OK'}`, file.response);
16004
16167
  }
16005
- // Other events
16168
+ // Other events: ignore
16006
16169
  else {
16007
- console.warn('[upload-file] Unknown event, returned by uploadFn\'s observable:', event);
16170
+ // DEBUG
16171
+ console.debug('[upload-file] Ignoring a file event: ', event);
16008
16172
  }
16009
16173
  return file;
16010
16174
  }), catchError((err) => {
@@ -26630,5 +26794,5 @@ CoreTestingModule.decorators = [
26630
26794
  * Generated bundle index. Do not edit.
26631
26795
  */
26632
26796
 
26633
- 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 };
26797
+ 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 };
26634
26798
  //# sourceMappingURL=sumaris-net.ngx-components.js.map