@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.
- package/esm2020/src/app/core/peer/select-peer.modal.mjs +15 -7
- package/esm2020/src/app/core/services/network.service.mjs +16 -11
- package/esm2020/src/app/shared/http/http.utils.mjs +4 -4
- package/fesm2015/sumaris-net.ngx-components.mjs +35 -21
- package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
- package/fesm2020/sumaris-net.ngx-components.mjs +30 -18
- package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/core/peer/select-peer.modal.d.ts +5 -2
|
@@ -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
|
|
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
|
-
|
|
14863
|
-
|
|
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
|
-
|
|
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
|
-
|
|
15692
|
-
return HttpUtils.getText(this.http, uri, opts);
|
|
15705
|
+
return HttpUtils.getText(this.http, this.getUri(path), opts);
|
|
15693
15706
|
}
|
|
15694
|
-
|
|
15695
|
-
|
|
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) {
|