@sumaris-net/ngx-components 2.4.59 → 2.4.61

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.
@@ -14166,7 +14166,7 @@ class HttpUtils {
14166
14166
  }
14167
14167
  catch (err) {
14168
14168
  if (err && err.message) {
14169
- console.error(`[network] Error on get request ${uri}: ${err.message}`, err);
14169
+ console.error(`[network] Error on get request ${uri}: ${err.message}`, JSON.stringify(err));
14170
14170
  }
14171
14171
  else {
14172
14172
  console.error(`[network] Error on get request ${uri}: ${err && err.statusText} - ${JSON.stringify(err)}`);
@@ -14190,12 +14190,12 @@ class HttpUtils {
14190
14190
  }
14191
14191
  catch (err) {
14192
14192
  if (err && err.message) {
14193
- console.error(`[network] Error on get request ${uri}: ${err.message}`, err);
14193
+ console.error(`[network] Error on get request ${uri}: ${err.message}`, JSON.stringify(err));
14194
14194
  }
14195
14195
  else {
14196
14196
  console.error(`[network] Error on get request ${uri}: ${err && err.statusText} - ${JSON.stringify(err)}`);
14197
14197
  }
14198
- throw { code: err.status, message: 'ERROR.UNKNOWN_NETWORK_ERROR' };
14198
+ throw err;
14199
14199
  }
14200
14200
  }
14201
14201
  }
@@ -14760,13 +14760,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
14760
14760
  }] } });
14761
14761
 
14762
14762
  class SelectPeerModal {
14763
- constructor(modalCtrl, popoverController, translate, http, cd, environment) {
14763
+ constructor(modalCtrl, popoverController, translate, http, cd, environment, loggingService) {
14764
14764
  this.modalCtrl = modalCtrl;
14765
14765
  this.popoverController = popoverController;
14766
14766
  this.translate = translate;
14767
14767
  this.http = http;
14768
14768
  this.cd = cd;
14769
14769
  this.environment = environment;
14770
+ this.loggingService = loggingService;
14770
14771
  this._subscription = new Subscription();
14771
14772
  this.loading = true;
14772
14773
  this.$peers = new Subject();
@@ -14776,6 +14777,7 @@ class SelectPeerModal {
14776
14777
  this.onRefresh = new EventEmitter();
14777
14778
  this.showSetManuallyButton = true;
14778
14779
  this.mobile = isMobile(window);
14780
+ this._logger = loggingService?.getLogger('network-modal');
14779
14781
  }
14780
14782
  set peers(peers) {
14781
14783
  this._subscription.add(peers.subscribe(res => this.refreshPeers(res)));
@@ -14858,10 +14860,10 @@ class SelectPeerModal {
14858
14860
  peer.name = summary.nodeName;
14859
14861
  }
14860
14862
  catch (err) {
14863
+ // If modal was not closed (e.g. response arrived too late => ignore)
14861
14864
  if (!this._subscription.closed) {
14862
- if (err && err.message) {
14863
- console.error('[select-peer] ' + err.message, err);
14864
- }
14865
+ console.error(`[select-peer] Error while calling '${peer.url}/api/node/info': ${err?.message || err}`, err);
14866
+ this._logger?.error(`Error while calling '${peer.url}/api/node/info': ${JSON.stringify(err)}`);
14865
14867
  }
14866
14868
  peer.status = 'DOWN';
14867
14869
  }
@@ -14896,7 +14898,7 @@ class SelectPeerModal {
14896
14898
  this.cd.markForCheck();
14897
14899
  }
14898
14900
  }
14899
- SelectPeerModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectPeerModal, deps: [{ token: i1.ModalController }, { token: i1.PopoverController }, { token: i1$2.TranslateService }, { token: i2$3.HttpClient }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
14901
+ SelectPeerModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectPeerModal, deps: [{ token: i1.ModalController }, { token: i1.PopoverController }, { token: i1$2.TranslateService }, { token: i2$3.HttpClient }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT }, { token: APP_LOGGING_SERVICE, optional: true }], target: i0.ɵɵFactoryTarget.Component });
14900
14902
  SelectPeerModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: SelectPeerModal, selector: "select-peer-modal", inputs: { canCancel: "canCancel", allowSelectDownPeer: "allowSelectDownPeer", onRefresh: "onRefresh", showSetManuallyButton: "showSetManuallyButton" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"cancel()\" *ngIf=\"canCancel\"\n visible-xs visible-sm visible-mobile>\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n </ion-buttons>\n\n <ion-title>\n {{'NETWORK.PEER.SELECT_MODAL.TITLE'|translate}}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n <!-- loader -->\n <ion-spinner *ngIf=\"loading; else endButtons\"></ion-spinner>\n\n <ng-template #endButtons>\n <!-- refresh button -->\n <ion-button *ngIf=\"onRefresh.observers | isNotEmptyArray\"\n [matTooltip]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"refresh($event)\">\n <mat-icon slot=\"icon-only\">refresh</mat-icon>\n </ion-button>\n </ng-template>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n\n <ion-list>\n\n <ion-list-header>\n <ion-label class=\"ion-text-wrap\">\n <p translate>NETWORK.PEER.SELECT_MODAL.HELP</p>\n </ion-label>\n </ion-list-header>\n\n <ion-item *ngFor=\"let peer of $peers | async\"\n tappable\n (click)=\"selectPeer(peer)\"\n detail\n @fadeInAnimation>\n\n <!-- icon -->\n <ion-avatar slot=\"start\" *ngIf=\"peer.reachable\" >\n <ion-img [src]=\"peer.favicon || (peer.url + '/api/favicon')\"></ion-img>\n </ion-avatar>\n <ion-icon slot=\"start\" *ngIf=\"!peer.reachable\" name=\"desktop\" color=\"medium\" class=\"ion-text-center\"></ion-icon>\n\n <!-- Peer is UP -->\n <ion-grid *ngIf=\"peer.reachable\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label class=\"ion-text-wrap\">\n <ion-text color=\"dark\">\n <h3>{{peer.hostAndPort}}{{peer.path}}</h3>\n </ion-text>\n <ion-text color=\"primary\">\n <h4>{{peer.label}}</h4>\n </ion-text>\n </ion-label>\n </ion-col>\n <ion-col class=\"ion-no-padding\">\n <ion-label class=\"ion-text-wrap ion-text-center\" color=\"medium\">\n <h3>{{peer.softwareName}}</h3>\n <h4 *ngIf=\"!peerMinVersion || isCompatible(peer); else invalidVersion\">\n <small>v{{peer.softwareVersion}}</small>\n </h4>\n <ng-template #invalidVersion>\n <ion-text color=\"danger\" [matTooltip]=\"'NETWORK.PEER.SELECT_MODAL.NOT_COMPATIBLE_HELP'|translate: {version: peerMinVersion} \">\n <h4 class=\"ion-color-danger\">\n <small><mat-icon>warning</mat-icon>v{{peer.softwareVersion}}</small>\n </h4>\n </ion-text>\n </ng-template>\n </ion-label>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Peer is DOWN -->\n <ion-label class=\"ion-text-wrap\" *ngIf=\"!peer.reachable\">\n <ion-text color=\"medium\">\n <h3>{{peer.hostAndPort}}{{peer.path}}</h3>\n </ion-text>\n <ion-text color=\"danger\">\n <h4>\n <small><ion-icon size=\"small\" name=\"close-circle\"></ion-icon></small>\n <span translate>NETWORK.PEER.OFFLINE</span>\n </h4>\n </ion-text>\n </ion-label>\n </ion-item>\n </ion-list>\n\n</ion-content>\n\n\n<ion-footer *ngIf=\"canCancel\" hidden-xs hidden-sm hidden-mobile>\n\n <ion-toolbar>\n\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <!-- buttons -->\n <ion-col size=\"auto\" *ngIf=\"showSetManuallyButton\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"clickSetManually($event)\">\n <ion-label translate>NETWORK.PEER.SELECT_MODAL.BTN_SET_MANUALLY</ion-label>\n </ion-button>\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n\n\n </ion-toolbar>\n</ion-footer>\n", styles: ["ion-item h4 ion-icon,ion-item h4 mat-icon{height:14px;width:14px;font-size:14px;line-height:14px}ion-item h4 small ion-icon,ion-item h4 small mat-icon{height:12px;width:12px;font-size:12px;line-height:12px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i1.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i1$2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "pipe", type: NotEmptyArrayPipe, name: "isNotEmptyArray" }], animations: [fadeInAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14901
14903
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectPeerModal, decorators: [{
14902
14904
  type: Component,
@@ -14904,6 +14906,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
14904
14906
  }], ctorParameters: function () { return [{ type: i1.ModalController }, { type: i1.PopoverController }, { type: i1$2.TranslateService }, { type: i2$3.HttpClient }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
14905
14907
  type: Inject,
14906
14908
  args: [ENVIRONMENT]
14909
+ }] }, { type: undefined, decorators: [{
14910
+ type: Optional
14911
+ }, {
14912
+ type: Inject,
14913
+ args: [APP_LOGGING_SERVICE]
14907
14914
  }] }]; }, propDecorators: { canCancel: [{
14908
14915
  type: Input
14909
14916
  }], allowSelectDownPeer: [{
@@ -15431,11 +15438,8 @@ class NetworkService extends StartableObservableService {
15431
15438
  return undefined; // No peer define. Skip
15432
15439
  peer = Peer.parseUrl(settings.peerUrl);
15433
15440
  }
15434
- const peerUrl = typeof peer === 'string' ? peer : peer.url;
15435
- this._logger?.info('checkPeerAlive', `Checking if peer {${peerUrl}} is alive, by calling /api/node/info ...`);
15436
15441
  try {
15437
15442
  const data = await this.getNodeInfo(peer);
15438
- this._logger?.info('checkPeerAlive', `Peer {${peerUrl}} is alive:\n${JSON.stringify(data)}`);
15439
15443
  return data;
15440
15444
  }
15441
15445
  catch (err) {
@@ -15462,9 +15466,19 @@ class NetworkService extends StartableObservableService {
15462
15466
  }
15463
15467
  return isCompatible;
15464
15468
  }
15465
- getNodeInfo(peer) {
15469
+ async getNodeInfo(peer) {
15466
15470
  const path = this.computePeerPath(peer, '/api/node/info');
15467
- return this.get(path);
15471
+ this._logger?.info('checkPeerAlive', `Getting '${path}' ...`);
15472
+ try {
15473
+ const data = await this.get(path);
15474
+ this._logger?.debug('checkPeerAlive', `Result:\n${JSON.stringify(data)}`);
15475
+ return data;
15476
+ }
15477
+ catch (err) {
15478
+ console.debug(`[network] Error while getting '${path}': ${err && err.message || err}`, err);
15479
+ this._logger?.error('checkPeerAlive', `[network] Error while getting '${path}': ${err?.message || ''}' ${JSON.stringify(err)}`);
15480
+ return undefined;
15481
+ }
15468
15482
  }
15469
15483
  async getAppManifest(peer, opts) {
15470
15484
  try {
@@ -15688,12 +15702,10 @@ class NetworkService extends StartableObservableService {
15688
15702
  this._timerSubscription.add(() => console.debug('[network] Refresh timer stopped'));
15689
15703
  }
15690
15704
  async getText(path, opts) {
15691
- let uri = this.getUri(path);
15692
- return HttpUtils.getText(this.http, uri, opts);
15705
+ return HttpUtils.getText(this.http, this.getUri(path), opts);
15693
15706
  }
15694
- async get(path, opts) {
15695
- let uri = this.getUri(path);
15696
- return HttpUtils.getJson(this.http, uri, opts);
15707
+ get(path, opts) {
15708
+ return HttpUtils.getJson(this.http, this.getUri(path), opts);
15697
15709
  }
15698
15710
  /* -- Protected methods -- */
15699
15711
  getUri(path) {