@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
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/cdk/table'), require('@angular/cdk/a11y'), require('@angular/cdk/overlay'), require('@angular/cdk/scrolling'), require('@angular/material/core'), require('@angular/material/table'), require('@angular/material/sort'), require('@angular/material/paginator'), require('@angular/material/form-field'), require('@angular/material/input'), require('@angular/material/checkbox'), require('@angular/material/expansion'), require('@angular/material/toolbar'), require('@angular/material/icon'), require('@angular/material/button'), require('@angular/material/menu'), require('@angular/material/select'), require('@angular/material/card'), require('@angular/material/tabs'), require('@angular/material/stepper'), require('@angular/material/list'), require('@angular/material/button-toggle'), require('@angular/material/progress-spinner'), require('@angular/material/progress-bar'), require('@angular/material/radio'), require('@angular/material/badge'), require('@angular/material/slide-toggle'), require('@angular/material/dialog'), require('@angular/material/autocomplete'), require('@angular/forms'), require('rxjs'), require('rxjs/operators'), require('@ngx-translate/core'), require('@ionic/angular'), require('moment'), require('@angular/material-moment-adapter'), require('@ionic-native/keyboard/ngx'), require('angular2-text-mask'), require('ngx-material-timepicker'), require('@angular/material/datepicker'), require('@angular/animations'), require('@angular/material/divider'), require('@angular/material/tooltip'), require('@angular/material/chips'), require('@angular/router'), require('@angular/platform-browser'), require('@angular/common/http'), require('ngx-color-picker'), require('@ionic-native/native-audio/ngx'), require('@ionic-native/vibration/ngx'), require('@ionic-native/audio-management/ngx'), require('@ionic-native/native-audio/ngx/index'), require('@ionic-native/vibration/ngx/index'), require('@ionic-native/audio-management/ngx/index'), require('uuid/v4'), require('@angular/cdk/drag-drop'), require('ngx-markdown'), require('tweetnacl'), require('@ionic/storage'), require('zone.js/dist/zone-error'), require('@ionic-native/splash-screen/ngx'), require('@ionic-native/network/ngx'), require('ionic-cache'), require('ionic-cache/dist/cache.service'), require('@ionic-native/network/ngx/index'), require('@ionic-native/splash-screen/ngx/index'), require('@ionic-native/status-bar/ngx'), require('@angular/cdk/platform'), require('@ionic-native/in-app-browser/ngx'), require('@apollo/client/core'), require('apollo-angular'), require('@apollo/client/link/ws'), require('@apollo/client/utilities'), require('@apollo/client/link/retry'), require('apollo-link-queue'), require('apollo-link-serialize'), require('apollo-link-logger'), require('apollo-angular/http'), require('apollo3-cache-persist'), require('@ionic-native/downloader/ngx'), require('@ionic-native/status-bar/ngx/index'), require('@ionic-native/keyboard/ngx/index'), require('@ionic-native/in-app-browser/ngx/index'), require('@ionic-native/downloader/ngx/index'), require('@angular/cdk/text-field'), require('@e-is/ngx-material-table'), require('@angular/cdk/collections'), require('ngx-jdenticon'), require('tweetnacl-util'), require('scrypt-async'), require('hammerjs')) :
3
- typeof define === 'function' && define.amd ? define('@sumaris-net/ngx-components', ['exports', '@angular/core', '@angular/common', '@angular/cdk/table', '@angular/cdk/a11y', '@angular/cdk/overlay', '@angular/cdk/scrolling', '@angular/material/core', '@angular/material/table', '@angular/material/sort', '@angular/material/paginator', '@angular/material/form-field', '@angular/material/input', '@angular/material/checkbox', '@angular/material/expansion', '@angular/material/toolbar', '@angular/material/icon', '@angular/material/button', '@angular/material/menu', '@angular/material/select', '@angular/material/card', '@angular/material/tabs', '@angular/material/stepper', '@angular/material/list', '@angular/material/button-toggle', '@angular/material/progress-spinner', '@angular/material/progress-bar', '@angular/material/radio', '@angular/material/badge', '@angular/material/slide-toggle', '@angular/material/dialog', '@angular/material/autocomplete', '@angular/forms', 'rxjs', 'rxjs/operators', '@ngx-translate/core', '@ionic/angular', 'moment', '@angular/material-moment-adapter', '@ionic-native/keyboard/ngx', 'angular2-text-mask', 'ngx-material-timepicker', '@angular/material/datepicker', '@angular/animations', '@angular/material/divider', '@angular/material/tooltip', '@angular/material/chips', '@angular/router', '@angular/platform-browser', '@angular/common/http', 'ngx-color-picker', '@ionic-native/native-audio/ngx', '@ionic-native/vibration/ngx', '@ionic-native/audio-management/ngx', '@ionic-native/native-audio/ngx/index', '@ionic-native/vibration/ngx/index', '@ionic-native/audio-management/ngx/index', 'uuid/v4', '@angular/cdk/drag-drop', 'ngx-markdown', 'tweetnacl', '@ionic/storage', 'zone.js/dist/zone-error', '@ionic-native/splash-screen/ngx', '@ionic-native/network/ngx', 'ionic-cache', 'ionic-cache/dist/cache.service', '@ionic-native/network/ngx/index', '@ionic-native/splash-screen/ngx/index', '@ionic-native/status-bar/ngx', '@angular/cdk/platform', '@ionic-native/in-app-browser/ngx', '@apollo/client/core', 'apollo-angular', '@apollo/client/link/ws', '@apollo/client/utilities', '@apollo/client/link/retry', 'apollo-link-queue', 'apollo-link-serialize', 'apollo-link-logger', 'apollo-angular/http', 'apollo3-cache-persist', '@ionic-native/downloader/ngx', '@ionic-native/status-bar/ngx/index', '@ionic-native/keyboard/ngx/index', '@ionic-native/in-app-browser/ngx/index', '@ionic-native/downloader/ngx/index', '@angular/cdk/text-field', '@e-is/ngx-material-table', '@angular/cdk/collections', 'ngx-jdenticon', 'tweetnacl-util', 'scrypt-async', 'hammerjs'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global["sumaris-net"] = global["sumaris-net"] || {}, global["sumaris-net"]["ngx-components"] = {}), global.ng.core, global.ng.common, global.ng.cdk.table, global.ng.cdk.a11y, global.ng.cdk.overlay, global.ng.cdk.scrolling, global.ng.material.core, global.ng.material.table, global.ng.material.sort, global.ng.material.paginator, global.ng.material.formField, global.ng.material.input, global.ng.material.checkbox, global.ng.material.expansion, global.ng.material.toolbar, global.ng.material.icon, global.ng.material.button, global.ng.material.menu, global.ng.material.select, global.ng.material.card, global.ng.material.tabs, global.ng.material.stepper, global.ng.material.list, global.ng.material.buttonToggle, global.ng.material.progressSpinner, global.ng.material.progressBar, global.ng.material.radio, global.ng.material.badge, global.ng.material.slideToggle, global.ng.material.dialog, global.ng.material.autocomplete, global.ng.forms, global.rxjs, global.rxjs.operators, global["ngx-translate"].core, global.ionic.angular, global.moment, global.ng.materialMomentAdapter, global["ionic-native"].keyboard.ngx, global["angular2-text-mask"], global["ngx-material-timepicker"], global.ng.material.datepicker, global.ng.animations, global.ng.material.divider, global.ng.material.tooltip, global.ng.material.chips, global.ng.router, global.ng.platformBrowser, global.ng.common.http, global["ngx-color-picker"], global["ionic-native"]["native-audio"].ngx, global["ionic-native"].vibration.ngx, global["ionic-native"]["audio-management"].ngx, global["ionic-native"]["native-audio"].ngx.index, global["ionic-native"].vibration.ngx.index, global["ionic-native"]["audio-management"].ngx.index, global.uuid.v4, global.ng.cdk.dragDrop, global["ngx-markdown"], global.tweetnacl, global.ionic.storage, null, global["ionic-native"]["splash-screen"].ngx, global["ionic-native"].network.ngx, global["ionic-cache"], global["ionic-cache/dist/cache"].service, global["ionic-native"].network.ngx.index, global["ionic-native"]["splash-screen"].ngx.index, global["ionic-native"]["status-bar"].ngx, global.ng.cdk.platform, global["ionic-native"]["in-app-browser"].ngx, global.apollo.client.core, global["apollo-angular"], global.apollo.client.link.ws, global.apollo.client.utilities, global.apollo.client.link.retry, global["apollo-link-queue"], global["apollo-link-serialize"], global["apollo-link-logger"], global["apollo-angular"].http, global["apollo3-cache-persist"], global["ionic-native"].downloader.ngx, global["ionic-native"]["status-bar"].ngx.index, global["ionic-native"].keyboard.ngx.index, global["ionic-native"]["in-app-browser"].ngx.index, global["ionic-native"].downloader.ngx.index, global.ng.cdk.textField, global["e-is"]["ngx-material-table"], global.ng.cdk.collections, global["ngx-jdenticon"]));
5
- })(this, (function (exports, i0, i1$4, table$1, a11y, overlay, scrolling, i1$3, table, sort$1, paginator, formField, input, checkbox, expansion, toolbar, icon, button, menu, select, card, tabs, stepper, list, buttonToggle, progressSpinner, progressBar, radio, badge, slideToggle, i2, autocomplete, i1, rxjs, operators, i1$2, i1$5, momentImported, i1$1, ngx, angular2TextMask, ngxMaterialTimepicker, datepicker, animations, divider, tooltip, chips, i3, i1$6, i2$1, ngxColorPicker, ngx$2, ngx$3, ngx$1, i2$2, i3$1, i4, uuidv4Imported, dragDrop, ngxMarkdown, tweetnacl, i3$2, zoneError, ngx$5, ngx$4, ionicCache, i6, i9, i10, ngx$7, i2$4, ngx$8, core, i2$3, ws, utilities, retry, QueueLink, SerializingLink, loggerLink, i3$3, apollo3CachePersist, ngx$6, i14, i15, i17, i18, textField, ngxMaterialTable, collections, ngxJdenticon) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/cdk/table'), require('@angular/cdk/a11y'), require('@angular/cdk/overlay'), require('@angular/cdk/scrolling'), require('@angular/material/core'), require('@angular/material/table'), require('@angular/material/sort'), require('@angular/material/paginator'), require('@angular/material/form-field'), require('@angular/material/input'), require('@angular/material/checkbox'), require('@angular/material/expansion'), require('@angular/material/toolbar'), require('@angular/material/icon'), require('@angular/material/button'), require('@angular/material/menu'), require('@angular/material/select'), require('@angular/material/card'), require('@angular/material/tabs'), require('@angular/material/stepper'), require('@angular/material/list'), require('@angular/material/button-toggle'), require('@angular/material/progress-spinner'), require('@angular/material/progress-bar'), require('@angular/material/radio'), require('@angular/material/badge'), require('@angular/material/slide-toggle'), require('@angular/material/dialog'), require('@angular/material/autocomplete'), require('@angular/forms'), require('rxjs'), require('rxjs/operators'), require('@ngx-translate/core'), require('@ionic/angular'), require('moment'), require('@angular/material-moment-adapter'), require('moment-timezone'), require('@ionic-native/keyboard/ngx'), require('angular2-text-mask'), require('ngx-material-timepicker'), require('@angular/material/datepicker'), require('@angular/animations'), require('@angular/material/divider'), require('@angular/material/tooltip'), require('@angular/material/chips'), require('@angular/router'), require('@angular/platform-browser'), require('@angular/common/http'), require('ngx-color-picker'), require('@ionic-native/native-audio/ngx'), require('@ionic-native/vibration/ngx'), require('@ionic-native/audio-management/ngx'), require('@ionic-native/native-audio/ngx/index'), require('@ionic-native/vibration/ngx/index'), require('@ionic-native/audio-management/ngx/index'), require('uuid/v4'), require('@angular/cdk/drag-drop'), require('ngx-markdown'), require('tweetnacl'), require('@ionic/storage'), require('zone.js/dist/zone-error'), require('@ionic-native/splash-screen/ngx'), require('@ionic-native/network/ngx'), require('ionic-cache'), require('ionic-cache/dist/cache.service'), require('@ionic-native/network/ngx/index'), require('@ionic-native/splash-screen/ngx/index'), require('@ionic-native/status-bar/ngx'), require('@angular/cdk/platform'), require('@ionic-native/in-app-browser/ngx'), require('@apollo/client/core'), require('apollo-angular'), require('@apollo/client/link/ws'), require('@apollo/client/utilities'), require('@apollo/client/link/retry'), require('apollo-link-queue'), require('apollo-link-serialize'), require('apollo-link-logger'), require('apollo-angular/http'), require('apollo3-cache-persist'), require('@ionic-native/downloader/ngx'), require('@ionic-native/status-bar/ngx/index'), require('@ionic-native/keyboard/ngx/index'), require('@ionic-native/in-app-browser/ngx/index'), require('@ionic-native/downloader/ngx/index'), require('@angular/cdk/text-field'), require('@e-is/ngx-material-table'), require('@angular/cdk/collections'), require('ngx-jdenticon'), require('tweetnacl-util'), require('scrypt-async'), require('hammerjs')) :
3
+ typeof define === 'function' && define.amd ? define('@sumaris-net/ngx-components', ['exports', '@angular/core', '@angular/common', '@angular/cdk/table', '@angular/cdk/a11y', '@angular/cdk/overlay', '@angular/cdk/scrolling', '@angular/material/core', '@angular/material/table', '@angular/material/sort', '@angular/material/paginator', '@angular/material/form-field', '@angular/material/input', '@angular/material/checkbox', '@angular/material/expansion', '@angular/material/toolbar', '@angular/material/icon', '@angular/material/button', '@angular/material/menu', '@angular/material/select', '@angular/material/card', '@angular/material/tabs', '@angular/material/stepper', '@angular/material/list', '@angular/material/button-toggle', '@angular/material/progress-spinner', '@angular/material/progress-bar', '@angular/material/radio', '@angular/material/badge', '@angular/material/slide-toggle', '@angular/material/dialog', '@angular/material/autocomplete', '@angular/forms', 'rxjs', 'rxjs/operators', '@ngx-translate/core', '@ionic/angular', 'moment', '@angular/material-moment-adapter', 'moment-timezone', '@ionic-native/keyboard/ngx', 'angular2-text-mask', 'ngx-material-timepicker', '@angular/material/datepicker', '@angular/animations', '@angular/material/divider', '@angular/material/tooltip', '@angular/material/chips', '@angular/router', '@angular/platform-browser', '@angular/common/http', 'ngx-color-picker', '@ionic-native/native-audio/ngx', '@ionic-native/vibration/ngx', '@ionic-native/audio-management/ngx', '@ionic-native/native-audio/ngx/index', '@ionic-native/vibration/ngx/index', '@ionic-native/audio-management/ngx/index', 'uuid/v4', '@angular/cdk/drag-drop', 'ngx-markdown', 'tweetnacl', '@ionic/storage', 'zone.js/dist/zone-error', '@ionic-native/splash-screen/ngx', '@ionic-native/network/ngx', 'ionic-cache', 'ionic-cache/dist/cache.service', '@ionic-native/network/ngx/index', '@ionic-native/splash-screen/ngx/index', '@ionic-native/status-bar/ngx', '@angular/cdk/platform', '@ionic-native/in-app-browser/ngx', '@apollo/client/core', 'apollo-angular', '@apollo/client/link/ws', '@apollo/client/utilities', '@apollo/client/link/retry', 'apollo-link-queue', 'apollo-link-serialize', 'apollo-link-logger', 'apollo-angular/http', 'apollo3-cache-persist', '@ionic-native/downloader/ngx', '@ionic-native/status-bar/ngx/index', '@ionic-native/keyboard/ngx/index', '@ionic-native/in-app-browser/ngx/index', '@ionic-native/downloader/ngx/index', '@angular/cdk/text-field', '@e-is/ngx-material-table', '@angular/cdk/collections', 'ngx-jdenticon', 'tweetnacl-util', 'scrypt-async', 'hammerjs'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global["sumaris-net"] = global["sumaris-net"] || {}, global["sumaris-net"]["ngx-components"] = {}), global.ng.core, global.ng.common, global.ng.cdk.table, global.ng.cdk.a11y, global.ng.cdk.overlay, global.ng.cdk.scrolling, global.ng.material.core, global.ng.material.table, global.ng.material.sort, global.ng.material.paginator, global.ng.material.formField, global.ng.material.input, global.ng.material.checkbox, global.ng.material.expansion, global.ng.material.toolbar, global.ng.material.icon, global.ng.material.button, global.ng.material.menu, global.ng.material.select, global.ng.material.card, global.ng.material.tabs, global.ng.material.stepper, global.ng.material.list, global.ng.material.buttonToggle, global.ng.material.progressSpinner, global.ng.material.progressBar, global.ng.material.radio, global.ng.material.badge, global.ng.material.slideToggle, global.ng.material.dialog, global.ng.material.autocomplete, global.ng.forms, global.rxjs, global.rxjs.operators, global["ngx-translate"].core, global.ionic.angular, global.moment, global.ng.materialMomentAdapter, global.momentTZImported, global["ionic-native"].keyboard.ngx, global["angular2-text-mask"], global["ngx-material-timepicker"], global.ng.material.datepicker, global.ng.animations, global.ng.material.divider, global.ng.material.tooltip, global.ng.material.chips, global.ng.router, global.ng.platformBrowser, global.ng.common.http, global["ngx-color-picker"], global["ionic-native"]["native-audio"].ngx, global["ionic-native"].vibration.ngx, global["ionic-native"]["audio-management"].ngx, global["ionic-native"]["native-audio"].ngx.index, global["ionic-native"].vibration.ngx.index, global["ionic-native"]["audio-management"].ngx.index, global.uuid.v4, global.ng.cdk.dragDrop, global["ngx-markdown"], global.tweetnacl, global.ionic.storage, null, global["ionic-native"]["splash-screen"].ngx, global["ionic-native"].network.ngx, global["ionic-cache"], global["ionic-cache/dist/cache"].service, global["ionic-native"].network.ngx.index, global["ionic-native"]["splash-screen"].ngx.index, global["ionic-native"]["status-bar"].ngx, global.ng.cdk.platform, global["ionic-native"]["in-app-browser"].ngx, global.apollo.client.core, global["apollo-angular"], global.apollo.client.link.ws, global.apollo.client.utilities, global.apollo.client.link.retry, global["apollo-link-queue"], global["apollo-link-serialize"], global["apollo-link-logger"], global["apollo-angular"].http, global["apollo3-cache-persist"], global["ionic-native"].downloader.ngx, global["ionic-native"]["status-bar"].ngx.index, global["ionic-native"].keyboard.ngx.index, global["ionic-native"]["in-app-browser"].ngx.index, global["ionic-native"].downloader.ngx.index, global.ng.cdk.textField, global["e-is"]["ngx-material-table"], global.ng.cdk.collections, global["ngx-jdenticon"]));
5
+ })(this, (function (exports, i0, i1$4, table$1, a11y, overlay, scrolling, i1$3, table, sort$1, paginator, formField, input, checkbox, expansion, toolbar, icon, button, menu, select, card, tabs, stepper, list, buttonToggle, progressSpinner, progressBar, radio, badge, slideToggle, i2, autocomplete, i1, rxjs, operators, i1$2, i1$5, momentImported, i1$1, momentTZImported, ngx, angular2TextMask, ngxMaterialTimepicker, datepicker, animations, divider, tooltip, chips, i3, i1$6, i2$1, ngxColorPicker, ngx$2, ngx$3, ngx$1, i2$2, i3$1, i4, uuidv4Imported, dragDrop, ngxMarkdown, tweetnacl, i3$2, zoneError, ngx$5, ngx$4, ionicCache, i6, i9, i10, ngx$7, i2$4, ngx$8, core, i2$3, ws, utilities, retry, QueueLink, SerializingLink, loggerLink, i3$3, apollo3CachePersist, ngx$6, i14, i15, i17, i18, textField, ngxMaterialTable, collections, ngxJdenticon) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -33,6 +33,7 @@
33
33
  var i1__namespace$4 = /*#__PURE__*/_interopNamespace(i1$5);
34
34
  var momentImported__namespace = /*#__PURE__*/_interopNamespace(momentImported);
35
35
  var i1__namespace = /*#__PURE__*/_interopNamespace(i1$1);
36
+ var momentTZImported__namespace = /*#__PURE__*/_interopNamespace(momentTZImported);
36
37
  var i3__namespace$3 = /*#__PURE__*/_interopNamespace(i3);
37
38
  var i1__namespace$5 = /*#__PURE__*/_interopNamespace(i1$6);
38
39
  var i2__namespace$2 = /*#__PURE__*/_interopNamespace(i2$1);
@@ -2572,6 +2573,7 @@
2572
2573
  ];
2573
2574
 
2574
2575
  var moment$5 = momentImported__namespace;
2576
+ var tz = momentTZImported__namespace;
2575
2577
  var DATE_UNIX_TIMESTAMP = 'X';
2576
2578
  var DATE_UNIX_MS_TIMESTAMP = 'x';
2577
2579
  var DateUtils = /** @class */ (function () {
@@ -2594,6 +2596,27 @@
2594
2596
  var d2 = fromDateISOString(date2);
2595
2597
  return (!d1 && !d2) || d1.isSame(d2, granularity);
2596
2598
  };
2599
+ /**
2600
+ * Create a copy of a date, without time fields (always return a new Moment object, or undefined).
2601
+ * Same implementation as the Java class Dates.resetTime() (see any SUMARiS like Pod)
2602
+ * @param value
2603
+ * @param timezone a timezone (see https://momentjs.com/timezone/)
2604
+ */
2605
+ DateUtils.resetTime = function (value, timezone) {
2606
+ if (!value)
2607
+ return undefined;
2608
+ var date = fromDateISOString(value);
2609
+ // No timezone
2610
+ if (!timezone) {
2611
+ return date.clone().startOf('day');
2612
+ }
2613
+ // Use timezone
2614
+ return moment$5.tz(timezone)
2615
+ .set('year', date.get('year'))
2616
+ .set('month', date.get('month'))
2617
+ .set('day', date.get('day'))
2618
+ .startOf('day');
2619
+ };
2597
2620
  return DateUtils;
2598
2621
  }());
2599
2622
  function toDateISOString(value) {
@@ -11206,7 +11229,18 @@
11206
11229
  switch (_a.label) {
11207
11230
  case 0:
11208
11231
  // Add headers
11209
- opts = Object.assign({}, opts);
11232
+ opts = Object.assign({}, opts
11233
+ //headers: new HttpHeaders(),
11234
+ //.append('X-App-Name', environment.name)
11235
+ //.append('X-App-Version', environment.version),
11236
+ );
11237
+ // Force no cache
11238
+ if (opts.nocache === true) {
11239
+ opts.headers = (opts.headers instanceof i2$1.HttpHeaders ? opts.headers : new i2$1.HttpHeaders(opts.headers));
11240
+ opts.headers
11241
+ .append('Cache-Control', 'no-cache')
11242
+ .append('Pragma', 'no-cache');
11243
+ }
11210
11244
  _a.label = 1;
11211
11245
  case 1:
11212
11246
  _a.trys.push([1, 3, , 4]);
@@ -11264,6 +11298,7 @@
11264
11298
  }());
11265
11299
  VersionUtils.compare = compareVersionNumbers;
11266
11300
  VersionUtils.isCompatible = isVersionCompatible;
11301
+ VersionUtils.isSame = isSameVersion;
11267
11302
  /**
11268
11303
  * Compare two software version numbers (e.g. 1.7.1)
11269
11304
  * Returns:
@@ -11332,6 +11367,9 @@
11332
11367
  //console.debug(`[http] Checking actual version {${actualVersion}} is compatible with min expected version {${minVersion}}`);
11333
11368
  return compareVersionNumbers(minVersion, actualVersion) <= 0;
11334
11369
  }
11370
+ function isSameVersion(v1, v2) {
11371
+ return compareVersionNumbers(v1, v2) === 0;
11372
+ }
11335
11373
 
11336
11374
  var SelectPeerModal = /** @class */ (function () {
11337
11375
  function SelectPeerModal(viewCtrl, cd, http, environment) {
@@ -12470,15 +12508,81 @@
12470
12508
  });
12471
12509
  };
12472
12510
  NetworkService.prototype.getNodeInfo = function (peer) {
12511
+ var path = this.computePeerPath(peer, '/api/node/info');
12512
+ return this.get(path);
12513
+ };
12514
+ NetworkService.prototype.getAppManifest = function (peer, opts) {
12515
+ return __awaiter(this, void 0, void 0, function () {
12516
+ var path, err_3;
12517
+ return __generator(this, function (_b) {
12518
+ switch (_b.label) {
12519
+ case 0:
12520
+ _b.trys.push([0, 2, , 3]);
12521
+ path = this.computePeerPath(peer, 'manifest.json');
12522
+ if (opts === null || opts === void 0 ? void 0 : opts.nocache) {
12523
+ path += '?t=' + Date.now();
12524
+ }
12525
+ return [4 /*yield*/, this.get(path, opts)];
12526
+ case 1: return [2 /*return*/, _b.sent()];
12527
+ case 2:
12528
+ err_3 = _b.sent();
12529
+ if (this.environment.production)
12530
+ console.error('[network] Cannot load file \'manifest.json\'. Please make sure webserver config allow CORS access', err_3);
12531
+ else
12532
+ console.error('[network] Cannot load file \'manifest.json\'.', err_3);
12533
+ return [3 /*break*/, 3];
12534
+ case 3: return [2 /*return*/];
12535
+ }
12536
+ });
12537
+ });
12538
+ };
12539
+ NetworkService.prototype.getAppVersion = function (peer, opts) {
12540
+ return __awaiter(this, void 0, void 0, function () {
12541
+ var path, appVersion, err_4, manifest;
12542
+ return __generator(this, function (_b) {
12543
+ switch (_b.label) {
12544
+ case 0:
12545
+ _b.trys.push([0, 2, , 3]);
12546
+ path = this.computePeerPath(peer, 'version.appup');
12547
+ if (opts === null || opts === void 0 ? void 0 : opts.nocache) {
12548
+ path += '?t=' + Date.now();
12549
+ }
12550
+ return [4 /*yield*/, this.get(path, opts)];
12551
+ case 1:
12552
+ appVersion = _b.sent();
12553
+ if (isNotNilOrBlank(appVersion))
12554
+ return [2 /*return*/, appVersion];
12555
+ return [3 /*break*/, 3];
12556
+ case 2:
12557
+ err_4 = _b.sent();
12558
+ if (this.environment.production)
12559
+ console.error('[network] Cannot load file \'version.appup\'. Please make sure webserver config allow CORS access');
12560
+ else
12561
+ console.error('[network] Cannot load file \'version.appup\'.', err_4);
12562
+ return [3 /*break*/, 3];
12563
+ case 3: return [4 /*yield*/, this.getAppManifest(peer, opts)];
12564
+ case 4:
12565
+ manifest = _b.sent();
12566
+ return [2 /*return*/, manifest === null || manifest === void 0 ? void 0 : manifest.version];
12567
+ }
12568
+ });
12569
+ });
12570
+ };
12571
+ NetworkService.prototype.computePeerPath = function (peer, path) {
12473
12572
  peer = peer || this.peer;
12474
12573
  if (!peer)
12475
12574
  return undefined;
12476
- var peerUrl = isInstanceOf(peer, exports.Peer) ? peer.url : peer;
12575
+ var peerUrl = (peer instanceof exports.Peer) ? peer.url : peer;
12477
12576
  // Remove trailing slash
12478
12577
  if (peerUrl.endsWith('/')) {
12479
12578
  peerUrl = peerUrl.substr(0, peerUrl.length - 1);
12480
12579
  }
12481
- return this.get(peerUrl + '/api/node/info');
12580
+ // Add first path
12581
+ if (!path.startsWith('/')) {
12582
+ path = '/' + path;
12583
+ }
12584
+ // Concat peer URL and path
12585
+ return peerUrl + path;
12482
12586
  };
12483
12587
  /**
12484
12588
  * Allow to force offline mode
@@ -15860,8 +15964,6 @@
15860
15964
  };
15861
15965
  AccountService.prototype.canUserWriteDataForDepartment = function (recorderDepartment) {
15862
15966
  if (ReferentialUtils.isEmpty(recorderDepartment)) {
15863
- if (!this.isAdmin())
15864
- console.warn('Unable to check if user has right: invalid recorderDepartment', recorderDepartment);
15865
15967
  return this.isAdmin();
15866
15968
  }
15867
15969
  // Should be login, and status ENABLE
@@ -17167,6 +17269,12 @@
17167
17269
  key: 'sumaris.android.install.url',
17168
17270
  label: 'CONFIGURATION.OPTIONS.ANDROID_INSTALL_URL',
17169
17271
  type: 'string'
17272
+ },
17273
+ DB_TIMEZONE: {
17274
+ key: 'sumaris.persistence.db.timezone',
17275
+ label: 'DB Timezone (readonly)',
17276
+ type: 'string',
17277
+ isTransient: true // ONly on server, cannot be set
17170
17278
  }
17171
17279
  });
17172
17280
 
@@ -17656,18 +17764,19 @@
17656
17764
  return this.platform.height();
17657
17765
  };
17658
17766
  PlatformService.prototype.ngOnStart = function () {
17767
+ var _a;
17659
17768
  return __awaiter(this, void 0, void 0, function () {
17660
- var now, storage, err_1;
17769
+ var now, storage, checkIntervalMs, err_1;
17661
17770
  var _this = this;
17662
- return __generator(this, function (_b) {
17663
- switch (_b.label) {
17771
+ return __generator(this, function (_d) {
17772
+ switch (_d.label) {
17664
17773
  case 0:
17665
17774
  now = Date.now();
17666
17775
  this.accountService.tokenType = undefined;
17667
17776
  console.info('[platform] Starting platform...');
17668
- _b.label = 1;
17777
+ _d.label = 1;
17669
17778
  case 1:
17670
- _b.trys.push([1, 6, , 7]);
17779
+ _d.trys.push([1, 8, , 9]);
17671
17780
  this._mobile = this.is('mobile');
17672
17781
  this._cordova = this.is('cordova');
17673
17782
  this._android = this.is('android');
@@ -17679,13 +17788,13 @@
17679
17788
  return [4 /*yield*/, this.configureTranslate()];
17680
17789
  case 2:
17681
17790
  // Configure translation
17682
- _b.sent();
17791
+ _d.sent();
17683
17792
  return [4 /*yield*/, this.storageReady()];
17684
17793
  case 3:
17685
- storage = _b.sent();
17794
+ storage = _d.sent();
17686
17795
  return [4 /*yield*/, this.migrateStorage(storage)];
17687
17796
  case 4:
17688
- _b.sent();
17797
+ _d.sent();
17689
17798
  // Start root services
17690
17799
  return [4 /*yield*/, Promise.all([
17691
17800
  this.entitiesStorage.ready(),
@@ -17696,12 +17805,19 @@
17696
17805
  ])];
17697
17806
  case 5:
17698
17807
  // Start root services
17699
- _b.sent();
17700
- console.info("[platform] Starting platform [OK] {mobile: " + this._mobile + ", downloader: " + this.canDownload + ", fileOpener: " + this.canOpenFile + "} in " + (Date.now() - now) + "ms");
17808
+ _d.sent();
17809
+ if (!(this.isWeb() && this.environment.production)) return [3 /*break*/, 7];
17810
+ return [4 /*yield*/, this.checkAppVersion({ canReload: true })];
17811
+ case 6:
17812
+ _d.sent();
17813
+ _d.label = 7;
17814
+ case 7:
17701
17815
  // Update cache configuration when network changed
17702
17816
  this.networkService.onNetworkStatusChanges
17703
- .pipe(operators.skip(1)) // Skip the first event (behavior subject send event immediately)
17817
+ .pipe(operators.skip(1) // Olready done once, so we skip the first event
17818
+ )
17704
17819
  .subscribe(function (type) { return _this.configureCache(type !== 'none'); });
17820
+ console.info("[platform] Starting platform [OK] {mobile: " + this._mobile + ", web: " + this.isWeb() + ", downloader: " + this.canDownload + ", fileOpener: " + this.canOpenFile + "} in " + (Date.now() - now) + "ms");
17705
17821
  // Update authentication type
17706
17822
  this.configService.config
17707
17823
  .pipe(operators.map(function (config) { return config === null || config === void 0 ? void 0 : config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE); }), operators.filter(isNotNilOrBlank), operators.distinctUntilChanged())
@@ -17718,12 +17834,19 @@
17718
17834
  _this.audioProvider.playStartupSound();
17719
17835
  }, 1000);
17720
17836
  }
17721
- return [3 /*break*/, 7];
17722
- case 6:
17723
- err_1 = _b.sent();
17837
+ checkIntervalMs = (this.environment.checkAppVersionIntervalInSeconds || 0) * 1000;
17838
+ if (this.isWeb() && this.environment.production && checkIntervalMs > 0) {
17839
+ (_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe();
17840
+ this.checkAppVersionTimer = rxjs.timer(checkIntervalMs, checkIntervalMs)
17841
+ .subscribe(function (_) { return _this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ }); });
17842
+ this.registerSubscription(this.checkAppVersionTimer);
17843
+ }
17844
+ return [3 /*break*/, 9];
17845
+ case 8:
17846
+ err_1 = _d.sent();
17724
17847
  // Manage startup error
17725
17848
  return [2 /*return*/, this.onStartupError(err_1)];
17726
- case 7: return [2 /*return*/];
17849
+ case 9: return [2 /*return*/];
17727
17850
  }
17728
17851
  });
17729
17852
  });
@@ -17844,16 +17967,89 @@
17844
17967
  this.cache.setDefaultTTL(cacheTTL);
17845
17968
  this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline
17846
17969
  };
17970
+ PlatformService.prototype.checkAppVersion = function (opts) {
17971
+ var _a, _b, _c;
17972
+ return __awaiter(this, void 0, void 0, function () {
17973
+ var silent, production, canAutoReload, actualVersion, peer, remoteVersion, reloadPath;
17974
+ return __generator(this, function (_d) {
17975
+ switch (_d.label) {
17976
+ case 0:
17977
+ if (this.networkService.offline || !this.isWeb())
17978
+ return [2 /*return*/]; // Skip
17979
+ silent = (opts === null || opts === void 0 ? void 0 : opts.silent) === true;
17980
+ production = this.environment.production;
17981
+ canAutoReload = !opts || opts.canReload !== false;
17982
+ if (!silent)
17983
+ console.info('[platform] Checking remote app version...');
17984
+ actualVersion = this.environment.version;
17985
+ if (isNilOrBlank(actualVersion)) {
17986
+ console.error('[platform] Missing required value for \'environment.version\'. Cannot check remote app version.');
17987
+ (_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe(); // Stop timer if exists
17988
+ return [2 /*return*/]; // Skip
17989
+ }
17990
+ peer = undefined;
17991
+ return [4 /*yield*/, this.networkService.getAppVersion(peer)];
17992
+ case 1:
17993
+ remoteVersion = _d.sent();
17994
+ if (isNilOrBlank(remoteVersion)) {
17995
+ if (production && !silent)
17996
+ console.error('[platform] Cannot load remote app version. Skipping version check');
17997
+ (_b = this.checkAppVersionTimer) === null || _b === void 0 ? void 0 : _b.unsubscribe(); // Stop timer if exists
17998
+ return [2 /*return*/];
17999
+ }
18000
+ if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
18001
+ if (!silent)
18002
+ console.info('[platform] Checking remote app version [OK]');
18003
+ return [2 /*return*/];
18004
+ }
18005
+ reloadPath = location.href.replace(/[&]?version=[0-9.]+/gi, '');
18006
+ reloadPath += (reloadPath.indexOf('?') === -1) ? '?' : '&'; // Add query param separator
18007
+ reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)
18008
+ // Already try to reload, but version still bad
18009
+ if (reloadPath === location.href) {
18010
+ if (canAutoReload)
18011
+ console.error("[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: " + actualVersion + ")");
18012
+ // Stop timer, to avoid infinite loop
18013
+ (_c = this.checkAppVersionTimer) === null || _c === void 0 ? void 0 : _c.unsubscribe();
18014
+ return [2 /*return*/];
18015
+ }
18016
+ console.warn("[platform] More recent version detected (remote: " + remoteVersion + ", actual: " + actualVersion);
18017
+ if (!canAutoReload) return [3 /*break*/, 2];
18018
+ console.info('[platform] Will reloading at ' + reloadPath);
18019
+ location.href = reloadPath;
18020
+ return [3 /*break*/, 4];
18021
+ case 2: return [4 /*yield*/, this.showToast({
18022
+ message: 'CONFIRM.RELOAD_APP',
18023
+ messageParams: { version: remoteVersion, name: this.environment.name },
18024
+ type: 'info', duration: -1,
18025
+ buttons: [
18026
+ // Reload button
18027
+ { text: this.translate.instant('COMMON.BTN_RELOAD'),
18028
+ side: 'end', handler: function () {
18029
+ location.href = reloadPath;
18030
+ return true;
18031
+ }
18032
+ }
18033
+ ]
18034
+ })];
18035
+ case 3:
18036
+ _d.sent();
18037
+ _d.label = 4;
18038
+ case 4: return [2 /*return*/];
18039
+ }
18040
+ });
18041
+ });
18042
+ };
17847
18043
  PlatformService.prototype.storageReady = function () {
17848
18044
  return __awaiter(this, void 0, void 0, function () {
17849
18045
  var forage, driver;
17850
- return __generator(this, function (_b) {
17851
- switch (_b.label) {
18046
+ return __generator(this, function (_d) {
18047
+ switch (_d.label) {
17852
18048
  case 0:
17853
18049
  console.info("[platform] Starting storage...");
17854
18050
  return [4 /*yield*/, this.storage.ready()];
17855
18051
  case 1:
17856
- forage = _b.sent();
18052
+ forage = _d.sent();
17857
18053
  driver = forage.driver();
17858
18054
  if (isNil(driver)) {
17859
18055
  console.error('[platform] NO DRIVER DEFINED IN STORAGE. Local storage cannot be used !');
@@ -17869,8 +18065,8 @@
17869
18065
  PlatformService.prototype.migrateStorage = function (storage) {
17870
18066
  return __awaiter(this, void 0, void 0, function () {
17871
18067
  var canMigrate, oldForage, keys, now, toast_1, duration, err_2;
17872
- return __generator(this, function (_b) {
17873
- switch (_b.label) {
18068
+ return __generator(this, function (_d) {
18069
+ switch (_d.label) {
17874
18070
  case 0:
17875
18071
  canMigrate = storage &&
17876
18072
  ((storage.driver() === 'cordovaSQLiteDriver' && (storage.supports(storage.INDEXEDDB) || storage.supports(storage.WEBSQL))) ||
@@ -17884,26 +18080,26 @@
17884
18080
  });
17885
18081
  return [4 /*yield*/, oldForage.keys()];
17886
18082
  case 1:
17887
- keys = _b.sent();
18083
+ keys = _d.sent();
17888
18084
  if (!isEmptyArray(keys)) return [3 /*break*/, 3];
17889
18085
  // Drop the old instance (not need anymore)
17890
18086
  console.debug("[platform] Old storage is empty: dropping unused instance {name: '" + storage.config().name + "', driver: '" + oldForage.driver() + "'}");
17891
18087
  return [4 /*yield*/, oldForage.dropInstance()];
17892
18088
  case 2:
17893
- _b.sent();
18089
+ _d.sent();
17894
18090
  return [3 /*break*/, 12];
17895
18091
  case 3:
17896
18092
  now = Date.now();
17897
18093
  console.info("[platform] Starting storage migration...");
17898
18094
  return [4 /*yield*/, this.showToast({ message: 'INFO.DATA_MIGRATION_STARTED', type: 'info', duration: 30000 })];
17899
18095
  case 4:
17900
- toast_1 = _b.sent();
17901
- _b.label = 5;
18096
+ toast_1 = _d.sent();
18097
+ _d.label = 5;
17902
18098
  case 5:
17903
- _b.trys.push([5, 9, , 12]);
18099
+ _d.trys.push([5, 9, , 12]);
17904
18100
  return [4 /*yield*/, StorageUtils.copy(oldForage, storage, { keys: keys, deleteAfterCopy: false })];
17905
18101
  case 6:
17906
- _b.sent();
18102
+ _d.sent();
17907
18103
  duration = Date.now() - now;
17908
18104
  setTimeout(function () { return toast_1.dismiss(); }, Math.max(2000 - duration, 0));
17909
18105
  return [4 /*yield*/, this.showToast({ message: 'INFO.DATA_MIGRATION_SUCCEED',
@@ -17911,26 +18107,26 @@
17911
18107
  showCloseButton: true
17912
18108
  })];
17913
18109
  case 7:
17914
- _b.sent();
18110
+ _d.sent();
17915
18111
  console.info('[platform] Starting storage migration [OK]');
17916
18112
  // Drop the old instance
17917
18113
  console.info("[platform] Drop old storage {name: '" + storage.config().name + "', driver: '" + oldForage.driver() + "'}");
17918
18114
  return [4 /*yield*/, oldForage.dropInstance()];
17919
18115
  case 8:
17920
- _b.sent();
18116
+ _d.sent();
17921
18117
  return [3 /*break*/, 12];
17922
18118
  case 9:
17923
- err_2 = _b.sent();
18119
+ err_2 = _d.sent();
17924
18120
  console.error(err_2 && err_2.message || err_2, err_2);
17925
18121
  return [4 /*yield*/, toast_1.dismiss()];
17926
18122
  case 10:
17927
- _b.sent();
18123
+ _d.sent();
17928
18124
  return [4 /*yield*/, this.showToast({ message: 'ERROR.DATA_MIGRATION_FAILED',
17929
18125
  type: 'error',
17930
18126
  showCloseButton: true
17931
18127
  })];
17932
18128
  case 11:
17933
- _b.sent();
18129
+ _d.sent();
17934
18130
  return [3 /*break*/, 12];
17935
18131
  case 12: return [2 /*return*/];
17936
18132
  }
@@ -17946,8 +18142,8 @@
17946
18142
  PlatformService.prototype.onStartupError = function (err) {
17947
18143
  return __awaiter(this, void 0, void 0, function () {
17948
18144
  var message, detailsMessage;
17949
- return __generator(this, function (_b) {
17950
- switch (_b.label) {
18145
+ return __generator(this, function (_d) {
18146
+ switch (_d.label) {
17951
18147
  case 0:
17952
18148
  console.error('[platform] Failed starting the platform! ', err);
17953
18149
  message = err && err.message || err;
@@ -17959,14 +18155,14 @@
17959
18155
  if (!this.translate) return [3 /*break*/, 2];
17960
18156
  return [4 /*yield*/, this.translate.get(message).toPromise()];
17961
18157
  case 1:
17962
- message = _b.sent();
18158
+ message = _d.sent();
17963
18159
  if (err && err.code) {
17964
18160
  message += " {code: " + err.code + "}";
17965
18161
  }
17966
18162
  return [3 /*break*/, 3];
17967
18163
  case 2:
17968
18164
  message = "Fatal error: Please contact your administrator.\n\n{code: " + (err && err.code || 'null') + ", message: \"" + message + "\"}";
17969
- _b.label = 3;
18165
+ _d.label = 3;
17970
18166
  case 3:
17971
18167
  if (!this.toastController) return [3 /*break*/, 5];
17972
18168
  if (detailsMessage) {
@@ -17979,7 +18175,7 @@
17979
18175
  message: message
17980
18176
  })];
17981
18177
  case 4:
17982
- _b.sent();
18178
+ _d.sent();
17983
18179
  return [3 /*break*/, 6];
17984
18180
  case 5:
17985
18181
  if (window) {
@@ -17993,7 +18189,7 @@
17993
18189
  if (err && err.details)
17994
18190
  console.error('cause', err.details);
17995
18191
  }
17996
- _b.label = 6;
18192
+ _d.label = 6;
17997
18193
  case 6: return [2 /*return*/];
17998
18194
  }
17999
18195
  });
@@ -18123,6 +18319,13 @@
18123
18319
  }
18124
18320
  return FileResponse;
18125
18321
  }());
18322
+ function isProgressEvent(event) {
18323
+ return event.type === i2$1.HttpEventType.UploadProgress
18324
+ || event.type === i2$1.HttpEventType.DownloadProgress;
18325
+ }
18326
+ function isResponseEvent(event) {
18327
+ return event.type === i2$1.HttpEventType.Response;
18328
+ }
18126
18329
 
18127
18330
  var UploadFileComponent = /** @class */ (function () {
18128
18331
  function UploadFileComponent(cd, translate) {
@@ -18289,7 +18492,7 @@
18289
18492
  operators.switchMap(function (file) { return _this.uploadFn(file)
18290
18493
  .pipe(operators.map(function (event) {
18291
18494
  // Progress event
18292
- if ((event === null || event === void 0 ? void 0 : event.type) === i2$1.HttpEventType.UploadProgress || event.type === i2$1.HttpEventType.User) {
18495
+ if (isProgressEvent(event)) {
18293
18496
  if (isNotNil(event.loaded) && event.loaded >= 0) {
18294
18497
  file.progress = Math.min(1, event.loaded / (event.total || 1));
18295
18498
  }
@@ -18297,15 +18500,20 @@
18297
18500
  file.progress = -1; // Indeterminate progression
18298
18501
  }
18299
18502
  }
18503
+ // User event
18504
+ else if (event.type === i2$1.HttpEventType.User) {
18505
+ file.progress = -1; // Indeterminate progression
18506
+ }
18300
18507
  // Response event
18301
- else if (event instanceof i2$1.HttpResponse || event instanceof FileResponse) {
18508
+ else if (isResponseEvent(event)) {
18302
18509
  file.progress = 1;
18303
18510
  file.response = event;
18304
18511
  console.debug("[upload-file] " + file.name + ": " + (event.statusText || 'OK'), file.response);
18305
18512
  }
18306
- // Other events
18513
+ // Other events: ignore
18307
18514
  else {
18308
- console.warn('[upload-file] Unknown event, returned by uploadFn\'s observable:', event);
18515
+ // DEBUG
18516
+ console.debug('[upload-file] Ignoring a file event: ', event);
18309
18517
  }
18310
18518
  return file;
18311
18519
  }), operators.catchError(function (err) {
@@ -31136,6 +31344,8 @@
31136
31344
  exports.isNotNilString = isNotNilString;
31137
31345
  exports.isNumber = isNumber;
31138
31346
  exports.isNumberRange = isNumberRange;
31347
+ exports.isProgressEvent = isProgressEvent;
31348
+ exports.isResponseEvent = isResponseEvent;
31139
31349
  exports.isTouchUi = isTouchUi;
31140
31350
  exports.isWindow = isWindow;
31141
31351
  exports.joinProperties = joinProperties;