aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-ui/src/app/directives/download-artifact/download-artifact.ts
diff options
context:
space:
mode:
Diffstat (limited to 'catalog-ui/src/app/directives/download-artifact/download-artifact.ts')
-rw-r--r--catalog-ui/src/app/directives/download-artifact/download-artifact.ts125
1 files changed, 125 insertions, 0 deletions
diff --git a/catalog-ui/src/app/directives/download-artifact/download-artifact.ts b/catalog-ui/src/app/directives/download-artifact/download-artifact.ts
new file mode 100644
index 0000000000..7c817935cf
--- /dev/null
+++ b/catalog-ui/src/app/directives/download-artifact/download-artifact.ts
@@ -0,0 +1,125 @@
+'use strict';
+import {IFileDownload, Component, ArtifactModel} from "app/models";
+import {EventListenerService, CacheService} from "app/services";
+import {EVENTS, FileUtils} from "app/utils";
+
+export class DOWNLOAD_CSS_CLASSES {
+ static DOWNLOAD_ICON = "table-download-btn tosca";
+ static LOADER_ICON = "tlv-loader small loader";
+}
+
+export interface IDownloadArtifactScope extends ng.IScope {
+ $window:any;
+ artifact:ArtifactModel;
+ component:Component;
+ instance:boolean;
+ download:Function;
+ showLoader:boolean;
+ downloadIconClass:string;
+ updateDownloadIcon:Function;
+}
+
+export class DownloadArtifactDirective implements ng.IDirective {
+
+ constructor(private $window:any, private cacheService:CacheService, private EventListenerService:EventListenerService, private fileUtils:FileUtils) {
+ }
+
+ scope = {
+ artifact: '=',
+ component: '=',
+ instance: '=',
+ showLoader: '=',
+ downloadIconClass: '@'
+ };
+ restrict = 'EA';
+
+ link = (scope:IDownloadArtifactScope, element:any) => {
+ scope.$window = this.$window;
+
+ element.on("click", function () {
+ scope.download(scope.artifact);
+ });
+
+
+ let initDownloadLoader = ()=> {
+ //if the artifact is in a middle of download progress register form callBack & change icon from download to loader
+ if (scope.showLoader && this.cacheService.get(scope.artifact.uniqueId)) {
+ this.EventListenerService.registerObserverCallback(EVENTS.DOWNLOAD_ARTIFACT_FINISH_EVENT + scope.artifact.uniqueId, scope.updateDownloadIcon);
+ window.setTimeout(():void => {
+ if (this.cacheService.get(scope.artifact.uniqueId)) {
+ element[0].className = DOWNLOAD_CSS_CLASSES.LOADER_ICON;
+ }
+ }, 1000);
+
+ }
+ };
+
+ let setDownloadedFileLoader = ()=> {
+ if (scope.showLoader) {
+ //set in cache service thet the artifact is in download progress
+ this.cacheService.set(scope.artifact.uniqueId, true);
+ initDownloadLoader();
+ }
+ };
+
+ let removeDownloadedFileLoader = ()=> {
+ if (scope.showLoader) {
+ this.cacheService.set(scope.artifact.uniqueId, false);
+ this.EventListenerService.notifyObservers(EVENTS.DOWNLOAD_ARTIFACT_FINISH_EVENT + scope.artifact.uniqueId);
+ }
+ };
+
+
+ //replace the loader to download icon
+ scope.updateDownloadIcon = () => {
+ element[0].className = scope.downloadIconClass || DOWNLOAD_CSS_CLASSES.DOWNLOAD_ICON;
+ };
+
+
+ initDownloadLoader();
+
+ scope.download = (artifact:ArtifactModel):void => {
+
+ let onFaild = (response):void => {
+ console.info('onFaild', response);
+ removeDownloadedFileLoader();
+ };
+
+ let onSuccess = (data:IFileDownload):void => {
+ downloadFile(data);
+ removeDownloadedFileLoader();
+ };
+
+ setDownloadedFileLoader();
+
+ if (scope.instance) {
+ scope.component.downloadInstanceArtifact(artifact.uniqueId).then(onSuccess, onFaild);
+ } else {
+ scope.component.downloadArtifact(artifact.uniqueId).then(onSuccess, onFaild);
+ }
+ };
+
+ let downloadFile = (file:IFileDownload):void => {
+ if (file) {
+ let blob = this.fileUtils.base64toBlob(file.base64Contents, '');
+ let fileName = file.artifactName;
+ this.fileUtils.downloadFile(blob, fileName);
+ }
+ };
+
+ element.on('$destroy', ()=> {
+ //remove listener of download event
+ if (scope.artifact && scope.artifact.uniqueId) {
+ this.EventListenerService.unRegisterObserver(EVENTS.DOWNLOAD_ARTIFACT_FINISH_EVENT + scope.artifact.uniqueId);
+ }
+ });
+
+ };
+
+ public static factory = ($window:any, cacheService:CacheService, EventListenerService:EventListenerService, fileUtils:FileUtils)=> {
+ return new DownloadArtifactDirective($window, cacheService, EventListenerService, fileUtils);
+ };
+
+}
+
+DownloadArtifactDirective.factory.$inject = ['$window', 'Sdc.Services.CacheService', 'EventListenerService', 'FileUtils'];