@sumaris-net/ngx-components 0.25.3 → 0.25.4

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.
@@ -13775,6 +13775,11 @@ class PlatformService {
13775
13775
  window.open(url, target, features, replace);
13776
13776
  }
13777
13777
  }
13778
+ getDownloadingPromise(uri) {
13779
+ return __awaiter(this, void 0, void 0, function* () {
13780
+ return this._downloadingPromise.get(uri);
13781
+ });
13782
+ }
13778
13783
  download(request) {
13779
13784
  return __awaiter(this, void 0, void 0, function* () {
13780
13785
  if (!request || !request.uri)
@@ -18488,7 +18493,6 @@ class AppInstallUpgradeCard {
18488
18493
  this._subscription = new Subscription();
18489
18494
  this._showUpdateOfflineFeature = false;
18490
18495
  this.loading = true;
18491
- this.downloading = false;
18492
18496
  this.waitingNetwork = false;
18493
18497
  this.showUpgradeWarning = true;
18494
18498
  this.showOfflineWarning = true;
@@ -18529,6 +18533,9 @@ class AppInstallUpgradeCard {
18529
18533
  ngOnDestroy() {
18530
18534
  this._subscription.unsubscribe();
18531
18535
  this._subscription = null;
18536
+ this.onUpdateOfflineModeClick.complete();
18537
+ this.installLinks = null;
18538
+ this.upgradeLinks = null;
18532
18539
  }
18533
18540
  download(event, link) {
18534
18541
  return __awaiter(this, void 0, void 0, function* () {
@@ -18536,35 +18543,13 @@ class AppInstallUpgradeCard {
18536
18543
  console.error('[install-upgrade-card] Missing required argument \'link.url\'');
18537
18544
  return; // Skip
18538
18545
  }
18539
- this.downloading = true;
18540
- try {
18541
- console.info('[install-upgrade-card] User click to download file: ' + link.url);
18542
- const location = yield this.platform.download({
18543
- uri: link.url,
18544
- title: link.name,
18545
- filename: link.downloadFilename,
18546
- mimeType: link.mimeType
18547
- });
18548
- console.info('[install-upgrade-card] File downloaded at: ' + location);
18549
- }
18550
- // Failed: display a toast
18551
- catch (err) {
18552
- console.error('[install-upgrade] Download failed: ' + (err && err.message || err));
18553
- this.showToast({
18554
- message: 'ERROR.DOWNLOAD_FAILED',
18555
- messageParams: { error: err },
18556
- type: 'error',
18557
- showCloseButton: true
18558
- });
18559
- return; // Stop here
18560
- }
18561
- finally {
18562
- this.downloading = false;
18563
- this.markForCheck();
18564
- }
18565
- if (!this._subscription)
18566
- return; // Skip if component destroyed
18567
- yield this.showDownloadCompleteDialog();
18546
+ const job = this.platform.download({
18547
+ uri: link.url,
18548
+ title: link.title,
18549
+ filename: link.filename,
18550
+ mimeType: link.mimeType
18551
+ });
18552
+ return this.listenDownloadPromise(link, job);
18568
18553
  });
18569
18554
  }
18570
18555
  tryOnline() {
@@ -18602,11 +18587,11 @@ class AppInstallUpgradeCard {
18602
18587
  return __awaiter(this, void 0, void 0, function* () {
18603
18588
  console.info('[install] Check if need to install or upgrade...');
18604
18589
  try {
18605
- const installLinks = this.getAllInstallLinks(config);
18590
+ const links = this.getLinks(config);
18606
18591
  // Check for upgrade
18607
- this.updateLinks = this.getCompatibleUpgradeLinks(installLinks, config);
18592
+ this.upgradeLinks = this.getCompatibleUpgradeLinks(links, config);
18608
18593
  // Check for install links (if no upgrade need)
18609
- this.installLinks = !this.updateLinks && this.getCompatibleInstallLinks(installLinks);
18594
+ this.installLinks = !this.upgradeLinks && this.getCompatibleInstallLinks(links);
18610
18595
  yield sleep(500); // Add a delay, for animation
18611
18596
  }
18612
18597
  finally {
@@ -18640,10 +18625,16 @@ class AppInstallUpgradeCard {
18640
18625
  // Use min version as default version
18641
18626
  upgradeLinks.forEach(link => {
18642
18627
  link.version = link.version || appMinVersionFromPod;
18628
+ const promise = this.platform.getDownloadingPromise(link.url);
18629
+ // Listening download promise, if exists
18630
+ if (promise) {
18631
+ console.info(`[install-upgrade-card] Platform is already downloading this file \'${link.url}\': listening promise...`);
18632
+ this.listenDownloadPromise(link, promise);
18633
+ }
18643
18634
  });
18644
18635
  return isNotEmptyArray(upgradeLinks) ? upgradeLinks : undefined;
18645
18636
  }
18646
- getAllInstallLinks(config) {
18637
+ getLinks(config) {
18647
18638
  const result = [];
18648
18639
  // Android
18649
18640
  {
@@ -18660,12 +18651,11 @@ class AppInstallUpgradeCard {
18660
18651
  // Compute App name
18661
18652
  const name = isNotNilOrBlank(url) && config.label || this.environment.defaultAppName || 'SUMARiS';
18662
18653
  if (url) {
18663
- let downloadFilename;
18664
- let version;
18654
+ let title;
18665
18655
  let mimeType;
18666
18656
  // Get file name
18667
- const filename = this.getFilename(url);
18668
- version = minVersion || 'latest';
18657
+ let filename = this.getFilename(url);
18658
+ let version = minVersion || 'latest';
18669
18659
  // OK, this is a downloadable APK file (e.g. NOT a link to a playstore)
18670
18660
  if (filename === null || filename === void 0 ? void 0 : filename.endsWith('.apk')) {
18671
18661
  // Define mime type
@@ -18674,18 +18664,18 @@ class AppInstallUpgradeCard {
18674
18664
  const versionMatches = /-v([1-9][0-9]*\.[0-9]+\.(:?(:?alpha|beta|rc)?[0-9]*))/i.exec(filename);
18675
18665
  version = versionMatches && versionMatches[1] || version;
18676
18666
  // Compute a new file name, with the version
18677
- if (isNotNilOrBlank(name)) {
18678
- downloadFilename = `${name}-v${version}.apk`.toLowerCase();
18667
+ if (isNotNilOrBlank(name) && version !== 'latest') {
18668
+ filename = `${name}-v${version}.apk`.toLowerCase();
18669
+ title = `${name} v${version}`;
18679
18670
  }
18680
18671
  else {
18681
- downloadFilename = filename;
18682
18672
  // Replace 'latest' with the app version, if present
18683
- if (downloadFilename.indexOf('latest')) {
18684
- downloadFilename = downloadFilename.replace('latest', version);
18673
+ if (filename.indexOf('latest')) {
18674
+ filename = filename.replace('latest', version);
18685
18675
  }
18686
18676
  }
18687
18677
  }
18688
- result.push({ name, url, platform: 'android', version, downloadFilename, mimeType });
18678
+ result.push({ name, url, platform: 'android', version, filename, title, mimeType });
18689
18679
  }
18690
18680
  }
18691
18681
  // iOS - TODO
@@ -18714,8 +18704,42 @@ class AppInstallUpgradeCard {
18714
18704
  yield Toasts.show(this.toastController, this.translate, opts);
18715
18705
  });
18716
18706
  }
18707
+ listenDownloadPromise(link, promise) {
18708
+ return __awaiter(this, void 0, void 0, function* () {
18709
+ if (!link || !promise)
18710
+ return; // Skip
18711
+ if (!link.downloading) {
18712
+ link.downloading = true;
18713
+ this.markForCheck();
18714
+ }
18715
+ try {
18716
+ const location = yield promise;
18717
+ console.info('[install-upgrade-card] File downloaded at: ' + location);
18718
+ }
18719
+ // Failed: display a toast
18720
+ catch (err) {
18721
+ console.error('[install-upgrade] Download failed: ' + (err && err.message || err));
18722
+ this.showDownloadFailedToast(err);
18723
+ }
18724
+ finally {
18725
+ link.downloading = false;
18726
+ this.markForCheck();
18727
+ }
18728
+ return this.showDownloadCompleteDialog();
18729
+ });
18730
+ }
18731
+ showDownloadFailedToast(err) {
18732
+ return this.showToast({
18733
+ message: 'ERROR.DOWNLOAD_FAILED',
18734
+ messageParams: { error: err },
18735
+ type: 'error',
18736
+ showCloseButton: true
18737
+ });
18738
+ }
18717
18739
  showDownloadCompleteDialog() {
18718
18740
  return __awaiter(this, void 0, void 0, function* () {
18741
+ if (!this._subscription)
18742
+ return; // Skip if component has been destroyed
18719
18743
  const translations = yield this.translate.get([
18720
18744
  'INFO.ALERT_HEADER',
18721
18745
  'INFO.DOWNLOAD_UPDATE_SUCCEED',
@@ -18740,7 +18764,7 @@ class AppInstallUpgradeCard {
18740
18764
  AppInstallUpgradeCard.decorators = [
18741
18765
  { type: Component, args: [{
18742
18766
  selector: 'app-install-upgrade-card',
18743
- template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card *ngIf=\"showUpgradeWarning && !loading && !offline && updateLinks\"\n color=\"accent\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of updateLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3>\n <span *ngIf=\"link.version\" [innerHTML]=\"'INFO.UPDATE_APP_TO_VERSION'| translate: link\"></span>\n <span *ngIf=\"!link.version\" [innerHTML]=\"'INFO.UPDATE_APP'| translate: link\"></span>\n </h3>\n <h4>\n <small *ngIf=\"last\" [innerHTML]=\"'INFO.UPDATE_APP_HELP'|translate\"></small>\n </h4>\n </ion-text>\n </ion-col>\n\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Install links -->\n<ion-card *ngIf=\"showInstallButton && !loading && !offline && installLinks\"\n color=\"secondary\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of installLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3 [innerHTML]=\"'INFO.DOWNLOAD_APP_TITLE'| translate: {name: link.name, platform: getPlatformName(link.platform) }\"></h3>\n <h4><small *ngIf=\"last\" [innerHTML]=\"'INFO.DOWNLOAD_APP_HELP'|translate\"></small></h4>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Update offline feature card-->\n<ion-card *ngIf=\"showUpdateOfflineFeature && !loading && !offline\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h4>\n <b [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE'| translate\"></b>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"onUpdateOfflineModeClick.emit($event)\">\n <span translate>NETWORK.BTN_UPDATE</span>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Display a download button, depending on the link URL, and the device platform -->\n<ng-template #downloadButton let-link>\n\n <ng-container *ngIf=\"link.downloadFilename; else redirectButton\">\n\n <ng-container *ngIf=\"platform.canDownload; else webDownloadButton\">\n <!-- Download using platform -->\n <ion-button *ngIf=\"!downloading; else waitingSpinner\"\n (click)=\"download($event, asLink(link))\"\n [disabled]=\"downloading\"\n color=\"tertiary\" class=\"ion-float-end\">\n <ion-icon slot=\"start\" *ngIf=\"!downloading\" name=\"download\"></ion-icon>\n <ion-spinner slot=\"start\" class=\"ion-no-padding\" *ngIf=\"downloading\"></ion-spinner>\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-container>\n\n <!-- Web download button -->\n <ng-template #webDownloadButton>\n <ion-button [download]=\"link.downloadFilename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-template>\n </ng-container>\n\n <!-- Web redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n</ng-template>\n\n\n<!-- Waiting spinner -->\n<ng-template #waitingSpinner>\n <ion-spinner color=\"light\"></ion-spinner>\n</ng-template>\n",
18767
+ template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card *ngIf=\"showUpgradeWarning && !loading && !offline && upgradeLinks\"\n color=\"accent\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of upgradeLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3>\n <span *ngIf=\"link.version\" [innerHTML]=\"'INFO.UPDATE_APP_TO_VERSION'| translate: link\"></span>\n <span *ngIf=\"!link.version\" [innerHTML]=\"'INFO.UPDATE_APP'| translate: link\"></span>\n </h3>\n <h4>\n <small *ngIf=\"last\" [innerHTML]=\"'INFO.UPDATE_APP_HELP'|translate\"></small>\n </h4>\n </ion-text>\n </ion-col>\n\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Install links -->\n<ion-card *ngIf=\"showInstallButton && !loading && !offline && installLinks\"\n color=\"secondary\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of installLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3 [innerHTML]=\"'INFO.DOWNLOAD_APP_TITLE'| translate: {name: link.name, platform: getPlatformName(link.platform) }\"></h3>\n <h4><small *ngIf=\"last\" [innerHTML]=\"'INFO.DOWNLOAD_APP_HELP'|translate\"></small></h4>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Update offline feature card-->\n<ion-card *ngIf=\"showUpdateOfflineFeature && !loading && !offline\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h4>\n <b [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE'| translate\"></b>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"onUpdateOfflineModeClick.emit($event)\">\n <span translate>NETWORK.BTN_UPDATE</span>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Display a download button, depending on the link URL, and the device platform -->\n<ng-template #downloadButton let-link>\n\n <ng-container *ngIf=\"link.downloadFilename; else redirectButton\">\n\n <ng-container *ngIf=\"platform.canDownload; else webDownloadButton\">\n <!-- Download using platform -->\n <ion-button (click)=\"download($event, asLink(link))\"\n [disabled]=\"link.downloading\"\n color=\"tertiary\" class=\"ion-float-end\">\n <ion-icon slot=\"start\" *ngIf=\"!link.downloading\" name=\"download\"></ion-icon>\n <ion-spinner slot=\"start\" class=\"ion-no-padding\" *ngIf=\"link.downloading\"></ion-spinner>\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-container>\n\n <!-- Web download button -->\n <ng-template #webDownloadButton>\n <ion-button [download]=\"link.downloadFilename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-template>\n </ng-container>\n\n <!-- Web redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n</ng-template>\n\n\n<!-- Waiting spinner -->\n<ng-template #waitingSpinner>\n <ion-spinner color=\"light\"></ion-spinner>\n</ng-template>\n",
18744
18768
  changeDetection: ChangeDetectionStrategy.OnPush,
18745
18769
  animations: [slideUpDownAnimation],
18746
18770
  styles: ["ion-text small{font-size:85%}"]