@sumaris-net/ngx-components 1.13.2 → 1.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +260 -50
  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/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 +88 -5
  11. package/esm2015/src/app/shared/dates.js +24 -1
  12. package/esm2015/src/app/shared/http/http.utils.js +14 -2
  13. package/esm2015/src/app/shared/upload-file/upload-file.component.js +12 -7
  14. package/esm2015/src/app/shared/upload-file/upload-file.model.js +8 -1
  15. package/esm2015/src/app/shared/version/versions.js +5 -1
  16. package/esm2015/src/environments/environment.class.js +1 -1
  17. package/fesm2015/sumaris-net.ngx-components.js +198 -12
  18. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  19. package/package.json +2 -1
  20. package/src/app/core/services/config/core.config.d.ts +1 -0
  21. package/src/app/core/services/network.service.d.ts +10 -1
  22. package/src/app/core/services/network.utils.d.ts +15 -0
  23. package/src/app/core/services/platform.service.d.ts +5 -0
  24. package/src/app/shared/dates.d.ts +7 -0
  25. package/src/app/shared/http/http.utils.d.ts +1 -0
  26. package/src/app/shared/upload-file/upload-file.model.d.ts +5 -3
  27. package/src/app/shared/version/versions.d.ts +2 -0
  28. package/src/assets/i18n/en-US.json +2 -5
  29. package/src/assets/i18n/en.json +2 -5
  30. package/src/assets/i18n/fr.json +4 -3
  31. package/src/assets/manifest.json +5 -5
  32. package/src/environments/environment.class.d.ts +1 -0
  33. package/src/theme/_responsive.scss +7 -3
  34. package/sumaris-net.ngx-components.metadata.json +1 -1
  35. package/src/assets/manifest.sumaris.json +0 -17
@@ -10,4 +10,11 @@ export class FileResponse {
10
10
  this.statusText = (init === null || init === void 0 ? void 0 : init.statusText) || 'OK';
11
11
  }
12
12
  }
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC91cGxvYWQtZmlsZS91cGxvYWQtZmlsZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsYUFBYSxFQUFrQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFdEMsTUFBTSxPQUFPLFVBQWMsU0FBUSxJQUFJO0NBTXRDO0FBV0QsTUFBTSxPQUFPLFlBQVk7SUFLdkIsWUFBWSxJQUE0RDtRQUgvRCxTQUFJLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUlyQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLE1BQU0sS0FBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxVQUFVLEtBQUksSUFBSSxDQUFDO0lBQzdDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0h0dHBFdmVudFR5cGUsIEh0dHBQcm9ncmVzc0V2ZW50LCBIdHRwUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7aXNOb3ROaWx9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBVcGxvYWRGaWxlPFQ+IGV4dGVuZHMgRmlsZSB7XG4gIHByb2dyZXNzPzogbnVtYmVyO1xuICBkZWxldGluZz86IGJvb2xlYW47XG4gIGVycm9yPzogc3RyaW5nO1xuXG4gIHJlc3BvbnNlPzogRmlsZVJlc3BvbnNlPFQ+IHwgSHR0cFJlc3BvbnNlPFQ+O1xufVxuXG5leHBvcnQgdHlwZSBGaWxlVXBsb2FkRm48VD4gPSAoZmlsZTogRmlsZSkgPT4gT2JzZXJ2YWJsZTxGaWxlRXZlbnQ8VD4+O1xuZXhwb3J0IHR5cGUgRmlsZURlbGV0ZUZuPFQ+ID0gKGZpbGU6IFVwbG9hZEZpbGU8VD4pID0+IFByb21pc2U8Ym9vbGVhbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVByb2dyZXNzRXZlbnQge1xuICB0eXBlOiBIdHRwRXZlbnRUeXBlO1xuICBsb2FkZWQ6IG51bWJlcjtcbiAgdG90YWw/OiBudW1iZXI7XG4gIHN0YXR1c1RleHQ/OiBzdHJpbmc7XG59XG5leHBvcnQgY2xhc3MgRmlsZVJlc3BvbnNlPFQ+IHtcbiAgcmVhZG9ubHkgYm9keTogVHxudWxsO1xuICByZWFkb25seSB0eXBlID0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZTtcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0YXR1c1RleHQ6IHN0cmluZztcbiAgY29uc3RydWN0b3IoaW5pdD86IHtib2R5PzogVHxudWxsOyBzdGF0dXNUZXh0Pzogc3RyaW5nOyBzdGF0dXM/OiBudW1iZXJ9KSB7XG4gICAgdGhpcy5ib2R5ID0gaXNOb3ROaWwoaW5pdD8uYm9keSkgPyBpbml0LmJvZHkgOiBudWxsO1xuICAgIHRoaXMuc3RhdHVzID0gaW5pdD8uc3RhdHVzIHx8IDA7XG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gaW5pdD8uc3RhdHVzVGV4dCB8fCAnT0snO1xuICB9XG59XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgRmlsZUV2ZW50PFQ+ID0gSHR0cFByb2dyZXNzRXZlbnQgfCBIdHRwUmVzcG9uc2U8VD4gfCBGaWxlUHJvZ3Jlc3NFdmVudCB8IEZpbGVSZXNwb25zZTxUPiA7XG4iXX0=
13
+ export function isProgressEvent(event) {
14
+ return event.type === HttpEventType.UploadProgress
15
+ || event.type === HttpEventType.DownloadProgress;
16
+ }
17
+ export function isResponseEvent(event) {
18
+ return event.type === HttpEventType.Response;
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC91cGxvYWQtZmlsZS91cGxvYWQtZmlsZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQVksYUFBYSxFQUFrQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9GLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFdEMsTUFBTSxPQUFPLFVBQWMsU0FBUSxJQUFJO0NBTXRDO0FBVUQsTUFBTSxPQUFPLFlBQVk7SUFLdkIsWUFBWSxJQUE0RDtRQUgvRCxTQUFJLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUlyQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLE1BQU0sS0FBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxVQUFVLEtBQUksSUFBSSxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQUlELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBdUM7SUFDckUsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxjQUFjO1dBQzdDLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixDQUFDO0FBQ3JELENBQUM7QUFDRCxNQUFNLFVBQVUsZUFBZSxDQUFJLEtBQWtDO0lBQ25FLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsUUFBUSxDQUFDO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBQcm9ncmVzc0V2ZW50LCBIdHRwUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7aXNOb3ROaWx9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBVcGxvYWRGaWxlPFQ+IGV4dGVuZHMgRmlsZSB7XG4gIHByb2dyZXNzPzogbnVtYmVyO1xuICBkZWxldGluZz86IGJvb2xlYW47XG4gIGVycm9yPzogc3RyaW5nO1xuXG4gIHJlc3BvbnNlPzogRmlsZVJlc3BvbnNlPFQ+IHwgSHR0cFJlc3BvbnNlPFQ+O1xufVxuXG5leHBvcnQgdHlwZSBGaWxlVXBsb2FkRm48VD4gPSAoZmlsZTogRmlsZSkgPT4gT2JzZXJ2YWJsZTxGaWxlRXZlbnQ8VD4gfCBIdHRwRXZlbnQ8VD4+O1xuZXhwb3J0IHR5cGUgRmlsZURlbGV0ZUZuPFQ+ID0gKGZpbGU6IFVwbG9hZEZpbGU8VD4pID0+IFByb21pc2U8Ym9vbGVhbj47XG5leHBvcnQgaW50ZXJmYWNlIEZpbGVQcm9ncmVzc0V2ZW50IHtcbiAgdHlwZTogSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzIHwgSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzcztcbiAgbG9hZGVkOiBudW1iZXI7XG4gIHRvdGFsPzogbnVtYmVyO1xuICBzdGF0dXNUZXh0Pzogc3RyaW5nO1xufVxuZXhwb3J0IGNsYXNzIEZpbGVSZXNwb25zZTxUPiB7XG4gIHJlYWRvbmx5IGJvZHk6IFR8bnVsbDtcbiAgcmVhZG9ubHkgdHlwZSA9IEh0dHBFdmVudFR5cGUuUmVzcG9uc2U7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKGluaXQ/OiB7Ym9keT86IFR8bnVsbDsgc3RhdHVzVGV4dD86IHN0cmluZzsgc3RhdHVzPzogbnVtYmVyfSkge1xuICAgIHRoaXMuYm9keSA9IGlzTm90TmlsKGluaXQ/LmJvZHkpID8gaW5pdC5ib2R5IDogbnVsbDtcbiAgICB0aGlzLnN0YXR1cyA9IGluaXQ/LnN0YXR1cyB8fCAwO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IGluaXQ/LnN0YXR1c1RleHQgfHwgJ09LJztcbiAgfVxufVxuXG5leHBvcnQgZGVjbGFyZSB0eXBlIEZpbGVFdmVudDxUPiA9IEh0dHBQcm9ncmVzc0V2ZW50IHwgSHR0cFJlc3BvbnNlPFQ+IHwgRmlsZVByb2dyZXNzRXZlbnQgfCBGaWxlUmVzcG9uc2U8VD4gO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9ncmVzc0V2ZW50KGV2ZW50OiAgSHR0cEV2ZW50PGFueT4gfCBGaWxlRXZlbnQ8YW55Pik6IGV2ZW50IGlzIEh0dHBQcm9ncmVzc0V2ZW50IHwgRmlsZVByb2dyZXNzRXZlbnQge1xuICByZXR1cm4gZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzc1xuICAgIHx8IGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuRG93bmxvYWRQcm9ncmVzcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3BvbnNlRXZlbnQ8VD4oZXZlbnQ6IEh0dHBFdmVudDxUPiB8IEZpbGVFdmVudDxUPik6IGV2ZW50IGlzIEh0dHBSZXNwb25zZTxUPiB8IEZpbGVSZXNwb25zZTxUPiB7XG4gIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlO1xufVxuIl19
@@ -6,6 +6,7 @@ export class VersionUtils {
6
6
  }
7
7
  VersionUtils.compare = compareVersionNumbers;
8
8
  VersionUtils.isCompatible = isVersionCompatible;
9
+ VersionUtils.isSame = isSameVersion;
9
10
  /**
10
11
  * Compare two software version numbers (e.g. 1.7.1)
11
12
  * Returns:
@@ -74,4 +75,7 @@ export function isVersionCompatible(minVersion, actualVersion) {
74
75
  //console.debug(`[http] Checking actual version {${actualVersion}} is compatible with min expected version {${minVersion}}`);
75
76
  return compareVersionNumbers(minVersion, actualVersion) <= 0;
76
77
  }
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC92ZXJzaW9uL3ZlcnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE1BQU0sTUFBTSxHQUFHO0lBQ2IsZ0JBQWdCLEVBQUUsT0FBTztJQUN6QixtQkFBbUIsRUFBRSwwREFBMEQ7Q0FDaEYsQ0FBQztBQUdGLE1BQU0sT0FBTyxZQUFZOztBQUNoQixvQkFBTyxHQUFHLHFCQUFxQixDQUFDO0FBQ2hDLHlCQUFZLEdBQUcsbUJBQW1CLENBQUM7QUFHNUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0YsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxFQUFFO0lBQzNDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5Qix3REFBd0Q7SUFFeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN0RCxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDdkMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUQsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdCLFNBQVM7U0FDVjtRQUNELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMzQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUNYO0lBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDcEMsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUNYO0lBRUQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyQyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkMsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0Qsb0RBQW9EO1lBQ3BELEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3Qyx5QkFBeUI7WUFDekIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxRQUFRO1lBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3QztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsYUFBYTtJQUMzRCxXQUFXO0lBQ1gsNkhBQTZIO0lBQzdILE9BQU8scUJBQXFCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCByZWdleHAgPSB7XG4gIFBPU0lUSVZFX0lOVEVHRVI6IC9eXFxkKyQvLFxuICBWRVJTSU9OX1BBUlRfUkVHRVhQOiAvXlswLTldK3xhbHBoYVswLTldK3xiZXRhWzAtOV0rfHJjWzAtOV0rfFswLTldKy1TTkFQU0hPVCQvXG59O1xuXG5cbmV4cG9ydCBjbGFzcyBWZXJzaW9uVXRpbHMge1xuICBzdGF0aWMgY29tcGFyZSA9IGNvbXBhcmVWZXJzaW9uTnVtYmVycztcbiAgc3RhdGljIGlzQ29tcGF0aWJsZSA9IGlzVmVyc2lvbkNvbXBhdGlibGU7XG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gc29mdHdhcmUgdmVyc2lvbiBudW1iZXJzIChlLmcuIDEuNy4xKVxuICogUmV0dXJuczpcbiAqXG4gKiAgMCBpZiB0aGV5J3JlIGlkZW50aWNhbFxuICogIG5lZ2F0aXZlIGlmIHYxIDwgdjJcbiAqICBwb3NpdGl2ZSBpZiB2MSA+IHYyXG4gKiAgTmFuIGlmIHRoZXkgaW4gdGhlIHdyb25nIGZvcm1hdFxuICpcbiAqICBFLmcuOlxuICpcbiAqICBhc3NlcnQodmVyc2lvbl9udW1iZXJfY29tcGFyZShcIjEuNy4xXCIsIFwiMS42LjEwXCIpID4gMCk7XG4gKiAgYXNzZXJ0KHZlcnNpb25fbnVtYmVyX2NvbXBhcmUoXCIxLjcuMVwiLCBcIjEuNy4xMFwiKSA8IDApO1xuICpcbiAqICBcIlVuaXQgdGVzdHNcIjogaHR0cDovL2pzZmlkZGxlLm5ldC9yaXBwZXIyMzQvWHY5V0wvMjgvXG4gKlxuICogIFRha2VuIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjgzMjcyMS8xMTIzNlxuICovXG4gZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uTnVtYmVycyh2MSwgdjIpe1xuICBjb25zdCB2MXBhcnRzID0gdjEuc3BsaXQoJy4nKTtcbiAgY29uc3QgdjJwYXJ0cyA9IHYyLnNwbGl0KCcuJyk7XG5cbiAgLy8gRmlyc3QsIHZhbGlkYXRlIGJvdGggbnVtYmVycyBhcmUgdHJ1ZSB2ZXJzaW9uIG51bWJlcnNcblxuICBpZiAoIXZhbGlkYXRlUGFydHModjFwYXJ0cykgfHwgIXZhbGlkYXRlUGFydHModjJwYXJ0cykpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2MXBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHYycGFydHMubGVuZ3RoID09PSBpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBpZiAodjFwYXJ0c1tpXSA9PT0gdjJwYXJ0c1tpXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh2MXBhcnRzW2ldID4gdjJwYXJ0c1tpXSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGlmICh2MXBhcnRzLmxlbmd0aCAhPSB2MnBhcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhcnRzKHBhcnRzKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgaXNOdW1iZXIgPSByZWdleHAuUE9TSVRJVkVfSU5URUdFUi50ZXN0KHBhcnRzW2ldKTtcbiAgICAvLyBGaXJzdCBwYXJ0IE1VU1QgYmUgYW4gaW50ZWdlclxuICAgIGlmIChpID09PSAwICYmICFpc051bWJlcikgcmV0dXJuIGZhbHNlO1xuICAgIC8vIElmIG5vdCBpbnRlZ2VyLCBzaG91bGQgYmUgJ2FscGhhJywgJ2JldGEnLCBldGMuXG4gICAgaWYgKCFpc051bWJlcikge1xuICAgICAgaWYgKCFyZWdleHAuVkVSU0lPTl9QQVJUX1JFR0VYUC50ZXN0KHBhcnRzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gUmVtb3ZlICctU05BUFNIT1QnLCBhcyBpdCBzaG91bGQgbmV2ZXIgYmUgaW4gcHJvZFxuICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5yZXBsYWNlKCctU05BUFNIT1QnLCAnJyk7XG4gICAgICAvLyBDaGVjayBhZ2FpbiBpZiBudW1lcmljXG4gICAgICBpc051bWJlciA9IHJlZ2V4cC5QT1NJVElWRV9JTlRFR0VSLnRlc3QocGFydHNbaV0pO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIGludCAobmVlZCBieSBjb21wYXJlIG9wZXJhdG9ycylcbiAgICBpZiAoaXNOdW1iZXIpIHBhcnRzW2ldID0gcGFyc2VJbnQocGFydHNbaV0pO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uQ29tcGF0aWJsZShtaW5WZXJzaW9uLCBhY3R1YWxWZXJzaW9uKSB7XG4gIC8vIERFViBPTkxZXG4gIC8vY29uc29sZS5kZWJ1ZyhgW2h0dHBdIENoZWNraW5nIGFjdHVhbCB2ZXJzaW9uIHske2FjdHVhbFZlcnNpb259fSBpcyBjb21wYXRpYmxlIHdpdGggbWluIGV4cGVjdGVkIHZlcnNpb24geyR7bWluVmVyc2lvbn19YCk7XG4gIHJldHVybiBjb21wYXJlVmVyc2lvbk51bWJlcnMobWluVmVyc2lvbiwgYWN0dWFsVmVyc2lvbikgPD0gMDtcbn1cbiJdfQ==
78
+ export function isSameVersion(v1, v2) {
79
+ return compareVersionNumbers(v1, v2) === 0;
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC92ZXJzaW9uL3ZlcnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE1BQU0sTUFBTSxHQUFHO0lBQ2IsZ0JBQWdCLEVBQUUsT0FBTztJQUN6QixtQkFBbUIsRUFBRSwwREFBMEQ7Q0FDaEYsQ0FBQztBQUdGLE1BQU0sT0FBTyxZQUFZOztBQUNoQixvQkFBTyxHQUFHLHFCQUFxQixDQUFDO0FBQ2hDLHlCQUFZLEdBQUcsbUJBQW1CLENBQUM7QUFDbkMsbUJBQU0sR0FBRyxhQUFhLENBQUM7QUFHaEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0YsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxFQUFFO0lBQzNDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5Qix3REFBd0Q7SUFFeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN0RCxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDdkMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUQsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdCLFNBQVM7U0FDVjtRQUNELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMzQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUNYO0lBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDcEMsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUNYO0lBRUQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyQyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkMsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0Qsb0RBQW9EO1lBQ3BELEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3Qyx5QkFBeUI7WUFDekIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxRQUFRO1lBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3QztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsYUFBYTtJQUMzRCxXQUFXO0lBQ1gsNkhBQTZIO0lBQzdILE9BQU8scUJBQXFCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRTtJQUNsQyxPQUFPLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuY29uc3QgcmVnZXhwID0ge1xuICBQT1NJVElWRV9JTlRFR0VSOiAvXlxcZCskLyxcbiAgVkVSU0lPTl9QQVJUX1JFR0VYUDogL15bMC05XSt8YWxwaGFbMC05XSt8YmV0YVswLTldK3xyY1swLTldK3xbMC05XSstU05BUFNIT1QkL1xufTtcblxuXG5leHBvcnQgY2xhc3MgVmVyc2lvblV0aWxzIHtcbiAgc3RhdGljIGNvbXBhcmUgPSBjb21wYXJlVmVyc2lvbk51bWJlcnM7XG4gIHN0YXRpYyBpc0NvbXBhdGlibGUgPSBpc1ZlcnNpb25Db21wYXRpYmxlO1xuICBzdGF0aWMgaXNTYW1lID0gaXNTYW1lVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBDb21wYXJlIHR3byBzb2Z0d2FyZSB2ZXJzaW9uIG51bWJlcnMgKGUuZy4gMS43LjEpXG4gKiBSZXR1cm5zOlxuICpcbiAqICAwIGlmIHRoZXkncmUgaWRlbnRpY2FsXG4gKiAgbmVnYXRpdmUgaWYgdjEgPCB2MlxuICogIHBvc2l0aXZlIGlmIHYxID4gdjJcbiAqICBOYW4gaWYgdGhleSBpbiB0aGUgd3JvbmcgZm9ybWF0XG4gKlxuICogIEUuZy46XG4gKlxuICogIGFzc2VydCh2ZXJzaW9uX251bWJlcl9jb21wYXJlKFwiMS43LjFcIiwgXCIxLjYuMTBcIikgPiAwKTtcbiAqICBhc3NlcnQodmVyc2lvbl9udW1iZXJfY29tcGFyZShcIjEuNy4xXCIsIFwiMS43LjEwXCIpIDwgMCk7XG4gKlxuICogIFwiVW5pdCB0ZXN0c1wiOiBodHRwOi8vanNmaWRkbGUubmV0L3JpcHBlcjIzNC9YdjlXTC8yOC9cbiAqXG4gKiAgVGFrZW4gZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82ODMyNzIxLzExMjM2XG4gKi9cbiBleHBvcnQgZnVuY3Rpb24gY29tcGFyZVZlcnNpb25OdW1iZXJzKHYxLCB2Mil7XG4gIGNvbnN0IHYxcGFydHMgPSB2MS5zcGxpdCgnLicpO1xuICBjb25zdCB2MnBhcnRzID0gdjIuc3BsaXQoJy4nKTtcblxuICAvLyBGaXJzdCwgdmFsaWRhdGUgYm90aCBudW1iZXJzIGFyZSB0cnVlIHZlcnNpb24gbnVtYmVyc1xuXG4gIGlmICghdmFsaWRhdGVQYXJ0cyh2MXBhcnRzKSB8fCAhdmFsaWRhdGVQYXJ0cyh2MnBhcnRzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHYxcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodjJwYXJ0cy5sZW5ndGggPT09IGkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmICh2MXBhcnRzW2ldID09PSB2MnBhcnRzW2ldKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHYxcGFydHNbaV0gPiB2MnBhcnRzW2ldKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgaWYgKHYxcGFydHMubGVuZ3RoICE9IHYycGFydHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUGFydHMocGFydHMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpc051bWJlciA9IHJlZ2V4cC5QT1NJVElWRV9JTlRFR0VSLnRlc3QocGFydHNbaV0pO1xuICAgIC8vIEZpcnN0IHBhcnQgTVVTVCBiZSBhbiBpbnRlZ2VyXG4gICAgaWYgKGkgPT09IDAgJiYgIWlzTnVtYmVyKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gSWYgbm90IGludGVnZXIsIHNob3VsZCBiZSAnYWxwaGEnLCAnYmV0YScsIGV0Yy5cbiAgICBpZiAoIWlzTnVtYmVyKSB7XG4gICAgICBpZiAoIXJlZ2V4cC5WRVJTSU9OX1BBUlRfUkVHRVhQLnRlc3QocGFydHNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBSZW1vdmUgJy1TTkFQU0hPVCcsIGFzIGl0IHNob3VsZCBuZXZlciBiZSBpbiBwcm9kXG4gICAgICBwYXJ0c1tpXSA9IHBhcnRzW2ldLnJlcGxhY2UoJy1TTkFQU0hPVCcsICcnKTtcbiAgICAgIC8vIENoZWNrIGFnYWluIGlmIG51bWVyaWNcbiAgICAgIGlzTnVtYmVyID0gcmVnZXhwLlBPU0lUSVZFX0lOVEVHRVIudGVzdChwYXJ0c1tpXSk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBzdHJpbmcgdG8gaW50IChuZWVkIGJ5IGNvbXBhcmUgb3BlcmF0b3JzKVxuICAgIGlmIChpc051bWJlcikgcGFydHNbaV0gPSBwYXJzZUludChwYXJ0c1tpXSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnNpb25Db21wYXRpYmxlKG1pblZlcnNpb24sIGFjdHVhbFZlcnNpb24pOiBib29sZWFuIHtcbiAgLy8gREVWIE9OTFlcbiAgLy9jb25zb2xlLmRlYnVnKGBbaHR0cF0gQ2hlY2tpbmcgYWN0dWFsIHZlcnNpb24geyR7YWN0dWFsVmVyc2lvbn19IGlzIGNvbXBhdGlibGUgd2l0aCBtaW4gZXhwZWN0ZWQgdmVyc2lvbiB7JHttaW5WZXJzaW9ufX1gKTtcbiAgcmV0dXJuIGNvbXBhcmVWZXJzaW9uTnVtYmVycyhtaW5WZXJzaW9uLCBhY3R1YWxWZXJzaW9uKSA8PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lVmVyc2lvbih2MSwgdjIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbXBhcmVWZXJzaW9uTnVtYmVycyh2MSwgdjIpID09PSAwO1xufVxuIl19
@@ -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
@@ -46,6 +46,7 @@ import * as momentImported from 'moment';
46
46
  import { isMoment } from 'moment';
47
47
  import * as i1 from '@angular/material-moment-adapter';
48
48
  import { MomentDateAdapter, MatMomentDateModule } from '@angular/material-moment-adapter';
49
+ import * as momentTZImported from 'moment-timezone';
49
50
  import { Keyboard } from '@ionic-native/keyboard/ngx';
50
51
  import { TextMaskModule } from 'angular2-text-mask';
51
52
  import { NgxMaterialTimepickerModule } from 'ngx-material-timepicker';
@@ -2196,6 +2197,7 @@ FileSizePipe.decorators = [
2196
2197
  ];
2197
2198
 
2198
2199
  const moment$5 = momentImported;
2200
+ const tz = momentTZImported;
2199
2201
  const DATE_UNIX_TIMESTAMP = 'X';
2200
2202
  const DATE_UNIX_MS_TIMESTAMP = 'x';
2201
2203
  class DateUtils {
@@ -2218,6 +2220,27 @@ class DateUtils {
2218
2220
  const d2 = fromDateISOString(date2);
2219
2221
  return (!d1 && !d2) || d1.isSame(d2, granularity);
2220
2222
  }
2223
+ /**
2224
+ * Create a copy of a date, without time fields (always return a new Moment object, or undefined).
2225
+ * Same implementation as the Java class Dates.resetTime() (see any SUMARiS like Pod)
2226
+ * @param value
2227
+ * @param timezone a timezone (see https://momentjs.com/timezone/)
2228
+ */
2229
+ static resetTime(value, timezone) {
2230
+ if (!value)
2231
+ return undefined;
2232
+ const date = fromDateISOString(value);
2233
+ // No timezone
2234
+ if (!timezone) {
2235
+ return date.clone().startOf('day');
2236
+ }
2237
+ // Use timezone
2238
+ return moment$5.tz(timezone)
2239
+ .set('year', date.get('year'))
2240
+ .set('month', date.get('month'))
2241
+ .set('day', date.get('day'))
2242
+ .startOf('day');
2243
+ }
2221
2244
  }
2222
2245
  function toDateISOString(value) {
2223
2246
  if (!value)
@@ -9979,7 +10002,18 @@ class HttpUtils {
9979
10002
  static getResource(http, uri, opts) {
9980
10003
  return __awaiter(this, void 0, void 0, function* () {
9981
10004
  // Add headers
9982
- opts = Object.assign({}, opts);
10005
+ opts = Object.assign({}, opts
10006
+ //headers: new HttpHeaders(),
10007
+ //.append('X-App-Name', environment.name)
10008
+ //.append('X-App-Version', environment.version),
10009
+ );
10010
+ // Force no cache
10011
+ if (opts.nocache === true) {
10012
+ opts.headers = (opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers));
10013
+ opts.headers
10014
+ .append('Cache-Control', 'no-cache')
10015
+ .append('Pragma', 'no-cache');
10016
+ }
9983
10017
  try {
9984
10018
  // Using web http client
9985
10019
  return (yield http.get(uri, opts).toPromise());
@@ -10021,6 +10055,7 @@ class VersionUtils {
10021
10055
  }
10022
10056
  VersionUtils.compare = compareVersionNumbers;
10023
10057
  VersionUtils.isCompatible = isVersionCompatible;
10058
+ VersionUtils.isSame = isSameVersion;
10024
10059
  /**
10025
10060
  * Compare two software version numbers (e.g. 1.7.1)
10026
10061
  * Returns:
@@ -10089,6 +10124,9 @@ function isVersionCompatible(minVersion, actualVersion) {
10089
10124
  //console.debug(`[http] Checking actual version {${actualVersion}} is compatible with min expected version {${minVersion}}`);
10090
10125
  return compareVersionNumbers(minVersion, actualVersion) <= 0;
10091
10126
  }
10127
+ function isSameVersion(v1, v2) {
10128
+ return compareVersionNumbers(v1, v2) === 0;
10129
+ }
10092
10130
 
10093
10131
  class SelectPeerModal {
10094
10132
  constructor(viewCtrl, cd, http, environment) {
@@ -11020,15 +11058,65 @@ class NetworkService extends StartableService {
11020
11058
  });
11021
11059
  }
11022
11060
  getNodeInfo(peer) {
11061
+ const path = this.computePeerPath(peer, '/api/node/info');
11062
+ return this.get(path);
11063
+ }
11064
+ getAppManifest(peer, opts) {
11065
+ return __awaiter(this, void 0, void 0, function* () {
11066
+ try {
11067
+ let path = this.computePeerPath(peer, 'manifest.json');
11068
+ if (opts === null || opts === void 0 ? void 0 : opts.nocache) {
11069
+ path += '?t=' + Date.now();
11070
+ }
11071
+ return yield this.get(path, opts);
11072
+ }
11073
+ catch (err) {
11074
+ if (this.environment.production)
11075
+ console.error('[network] Cannot load file \'manifest.json\'. Please make sure webserver config allow CORS access', err);
11076
+ else
11077
+ console.error('[network] Cannot load file \'manifest.json\'.', err);
11078
+ // Continue
11079
+ }
11080
+ });
11081
+ }
11082
+ getAppVersion(peer, opts) {
11083
+ return __awaiter(this, void 0, void 0, function* () {
11084
+ try {
11085
+ let path = this.computePeerPath(peer, 'version.appup');
11086
+ if (opts === null || opts === void 0 ? void 0 : opts.nocache) {
11087
+ path += '?t=' + Date.now();
11088
+ }
11089
+ const appVersion = yield this.get(path, opts);
11090
+ if (isNotNilOrBlank(appVersion))
11091
+ return appVersion;
11092
+ }
11093
+ catch (err) {
11094
+ if (this.environment.production)
11095
+ console.error('[network] Cannot load file \'version.appup\'. Please make sure webserver config allow CORS access');
11096
+ else
11097
+ console.error('[network] Cannot load file \'version.appup\'.', err);
11098
+ // Continue
11099
+ }
11100
+ // Try loading manifest.json
11101
+ const manifest = yield this.getAppManifest(peer, opts);
11102
+ return manifest === null || manifest === void 0 ? void 0 : manifest.version;
11103
+ });
11104
+ }
11105
+ computePeerPath(peer, path) {
11023
11106
  peer = peer || this.peer;
11024
11107
  if (!peer)
11025
11108
  return undefined;
11026
- let peerUrl = isInstanceOf(peer, Peer) ? peer.url : peer;
11109
+ let peerUrl = (peer instanceof Peer) ? peer.url : peer;
11027
11110
  // Remove trailing slash
11028
11111
  if (peerUrl.endsWith('/')) {
11029
11112
  peerUrl = peerUrl.substr(0, peerUrl.length - 1);
11030
11113
  }
11031
- return this.get(peerUrl + '/api/node/info');
11114
+ // Add first path
11115
+ if (!path.startsWith('/')) {
11116
+ path = '/' + path;
11117
+ }
11118
+ // Concat peer URL and path
11119
+ return peerUrl + path;
11032
11120
  }
11033
11121
  /**
11034
11122
  * Allow to force offline mode
@@ -13951,8 +14039,6 @@ class AccountService extends BaseGraphqlService {
13951
14039
  }
13952
14040
  canUserWriteDataForDepartment(recorderDepartment) {
13953
14041
  if (ReferentialUtils.isEmpty(recorderDepartment)) {
13954
- if (!this.isAdmin())
13955
- console.warn('Unable to check if user has right: invalid recorderDepartment', recorderDepartment);
13956
14042
  return this.isAdmin();
13957
14043
  }
13958
14044
  // Should be login, and status ENABLE
@@ -15037,6 +15123,12 @@ const CORE_CONFIG_OPTIONS = Object.freeze({
15037
15123
  key: 'sumaris.android.install.url',
15038
15124
  label: 'CONFIGURATION.OPTIONS.ANDROID_INSTALL_URL',
15039
15125
  type: 'string'
15126
+ },
15127
+ DB_TIMEZONE: {
15128
+ key: 'sumaris.persistence.db.timezone',
15129
+ label: 'DB Timezone (readonly)',
15130
+ type: 'string',
15131
+ isTransient: true // ONly on server, cannot be set
15040
15132
  }
15041
15133
  });
15042
15134
 
@@ -15471,6 +15563,7 @@ class PlatformService extends StartableService {
15471
15563
  return this.platform.height();
15472
15564
  }
15473
15565
  ngOnStart() {
15566
+ var _a;
15474
15567
  return __awaiter(this, void 0, void 0, function* () {
15475
15568
  const now = Date.now();
15476
15569
  this.accountService.tokenType = undefined;
@@ -15496,11 +15589,16 @@ class PlatformService extends StartableService {
15496
15589
  this.networkService.ready(),
15497
15590
  this.audioProvider.ready()
15498
15591
  ]);
15499
- console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
15592
+ // Check if web app has update, and reload page if need
15593
+ if (this.isWeb() && this.environment.production) {
15594
+ yield this.checkAppVersion({ canReload: true });
15595
+ }
15500
15596
  // Update cache configuration when network changed
15501
15597
  this.networkService.onNetworkStatusChanges
15502
- .pipe(skip(1)) // Skip the first event (behavior subject send event immediately)
15598
+ .pipe(skip(1) // Olready done once, so we skip the first event
15599
+ )
15503
15600
  .subscribe(type => this.configureCache(type !== 'none'));
15601
+ console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, web: ${this.isWeb()}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
15504
15602
  // Update authentication type
15505
15603
  this.configService.config
15506
15604
  .pipe(map(config => config === null || config === void 0 ? void 0 : config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE)), filter(isNotNilOrBlank), distinctUntilChanged())
@@ -15517,6 +15615,14 @@ class PlatformService extends StartableService {
15517
15615
  this.audioProvider.playStartupSound();
15518
15616
  }, 1000);
15519
15617
  }
15618
+ // Check if new version, every 1 min
15619
+ const checkIntervalMs = (this.environment.checkAppVersionIntervalInSeconds || 0) * 1000;
15620
+ if (this.isWeb() && this.environment.production && checkIntervalMs > 0) {
15621
+ (_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe();
15622
+ this.checkAppVersionTimer = timer(checkIntervalMs, checkIntervalMs)
15623
+ .subscribe(_ => this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ }));
15624
+ this.registerSubscription(this.checkAppVersionTimer);
15625
+ }
15520
15626
  }
15521
15627
  catch (err) {
15522
15628
  // Manage startup error
@@ -15638,6 +15744,74 @@ class PlatformService extends StartableService {
15638
15744
  this.cache.setDefaultTTL(cacheTTL);
15639
15745
  this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline
15640
15746
  }
15747
+ checkAppVersion(opts) {
15748
+ var _a, _b, _c;
15749
+ return __awaiter(this, void 0, void 0, function* () {
15750
+ if (this.networkService.offline || !this.isWeb())
15751
+ return; // Skip
15752
+ const silent = (opts === null || opts === void 0 ? void 0 : opts.silent) === true;
15753
+ const production = this.environment.production;
15754
+ const canAutoReload = !opts || opts.canReload !== false;
15755
+ if (!silent)
15756
+ console.info('[platform] Checking remote app version...');
15757
+ const actualVersion = this.environment.version;
15758
+ if (isNilOrBlank(actualVersion)) {
15759
+ console.error('[platform] Missing required value for \'environment.version\'. Cannot check remote app version.');
15760
+ (_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe(); // Stop timer if exists
15761
+ return; // Skip
15762
+ }
15763
+ const peer = undefined; // location.origin + this.environment.baseUrl;
15764
+ const remoteVersion = yield this.networkService.getAppVersion(peer);
15765
+ if (isNilOrBlank(remoteVersion)) {
15766
+ if (production && !silent)
15767
+ console.error('[platform] Cannot load remote app version. Skipping version check');
15768
+ (_b = this.checkAppVersionTimer) === null || _b === void 0 ? void 0 : _b.unsubscribe(); // Stop timer if exists
15769
+ return;
15770
+ }
15771
+ if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
15772
+ if (!silent)
15773
+ console.info('[platform] Checking remote app version [OK]');
15774
+ return;
15775
+ }
15776
+ // If newer version exists
15777
+ let reloadPath = location.href.replace(/[&]?version=[0-9.]+/gi, ''); // Remove old version in query params
15778
+ reloadPath += (reloadPath.indexOf('?') === -1) ? '?' : '&'; // Add query param separator
15779
+ reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)
15780
+ // Already try to reload, but version still bad
15781
+ if (reloadPath === location.href) {
15782
+ if (canAutoReload)
15783
+ console.error(`[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: ${actualVersion})`);
15784
+ // Stop timer, to avoid infinite loop
15785
+ (_c = this.checkAppVersionTimer) === null || _c === void 0 ? void 0 : _c.unsubscribe();
15786
+ return;
15787
+ }
15788
+ console.warn(`[platform] More recent version detected (remote: ${remoteVersion}, actual: ${actualVersion}`);
15789
+ // Auto reload
15790
+ if (canAutoReload) {
15791
+ console.info('[platform] Will reloading at ' + reloadPath);
15792
+ location.href = reloadPath;
15793
+ // App stop
15794
+ }
15795
+ // Ask user to reload
15796
+ else {
15797
+ yield this.showToast({
15798
+ message: 'CONFIRM.RELOAD_APP',
15799
+ messageParams: { version: remoteVersion, name: this.environment.name },
15800
+ type: 'info', duration: -1,
15801
+ buttons: [
15802
+ // Reload button
15803
+ { text: this.translate.instant('COMMON.BTN_RELOAD'),
15804
+ side: 'end',
15805
+ handler: () => {
15806
+ location.href = reloadPath;
15807
+ return true;
15808
+ }
15809
+ }
15810
+ ]
15811
+ });
15812
+ }
15813
+ });
15814
+ }
15641
15815
  storageReady() {
15642
15816
  return __awaiter(this, void 0, void 0, function* () {
15643
15817
  console.info(`[platform] Starting storage...`);
@@ -15853,6 +16027,13 @@ class FileResponse {
15853
16027
  this.statusText = (init === null || init === void 0 ? void 0 : init.statusText) || 'OK';
15854
16028
  }
15855
16029
  }
16030
+ function isProgressEvent(event) {
16031
+ return event.type === HttpEventType.UploadProgress
16032
+ || event.type === HttpEventType.DownloadProgress;
16033
+ }
16034
+ function isResponseEvent(event) {
16035
+ return event.type === HttpEventType.Response;
16036
+ }
15856
16037
 
15857
16038
  class UploadFileComponent {
15858
16039
  constructor(cd, translate) {
@@ -15988,7 +16169,7 @@ class UploadFileComponent {
15988
16169
  switchMap(file => this.uploadFn(file)
15989
16170
  .pipe(map((event) => {
15990
16171
  // Progress event
15991
- if ((event === null || event === void 0 ? void 0 : event.type) === HttpEventType.UploadProgress || event.type === HttpEventType.User) {
16172
+ if (isProgressEvent(event)) {
15992
16173
  if (isNotNil(event.loaded) && event.loaded >= 0) {
15993
16174
  file.progress = Math.min(1, event.loaded / (event.total || 1));
15994
16175
  }
@@ -15996,15 +16177,20 @@ class UploadFileComponent {
15996
16177
  file.progress = -1; // Indeterminate progression
15997
16178
  }
15998
16179
  }
16180
+ // User event
16181
+ else if (event.type === HttpEventType.User) {
16182
+ file.progress = -1; // Indeterminate progression
16183
+ }
15999
16184
  // Response event
16000
- else if (event instanceof HttpResponse || event instanceof FileResponse) {
16185
+ else if (isResponseEvent(event)) {
16001
16186
  file.progress = 1;
16002
16187
  file.response = event;
16003
16188
  console.debug(`[upload-file] ${file.name}: ${event.statusText || 'OK'}`, file.response);
16004
16189
  }
16005
- // Other events
16190
+ // Other events: ignore
16006
16191
  else {
16007
- console.warn('[upload-file] Unknown event, returned by uploadFn\'s observable:', event);
16192
+ // DEBUG
16193
+ console.debug('[upload-file] Ignoring a file event: ', event);
16008
16194
  }
16009
16195
  return file;
16010
16196
  }), catchError((err) => {
@@ -26630,5 +26816,5 @@ CoreTestingModule.decorators = [
26630
26816
  * Generated bundle index. Do not edit.
26631
26817
  */
26632
26818
 
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 };
26819
+ 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
26820
  //# sourceMappingURL=sumaris-net.ngx-components.js.map