/*- * ============LICENSE_START======================================================= * SDC * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ /// module Sdc.Directives { 'use strict'; 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: Models.ArtifactModel; component: Models.Components.Component; instance:boolean; download: Function; showLoader:boolean; updateDownloadIcon:Function; } export class DownloadArtifactDirective implements ng.IDirective { constructor(private $window:any,private cacheService:Services.CacheService, private EventListenerService:Services.EventListenerService, private fileUtils:Sdc.Utils.FileUtils) {} scope = { artifact: '=', component: '=', instance:'=', showLoader:'=' }; 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(Utils.Constants.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(Utils.Constants.EVENTS.DOWNLOAD_ARTIFACT_FINISH_EVENT + scope.artifact.uniqueId); } }; //replace the loader to download icon scope.updateDownloadIcon = () =>{ element[0].className = DOWNLOAD_CSS_CLASSES.DOWNLOAD_ICON; }; initDownloadLoader(); scope.download = (artifact:Models.ArtifactModel):void => { let onFaild = (response):void => { console.info('onFaild', response); removeDownloadedFileLoader(); }; let onSuccess = (data:Models.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:Models.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(Utils.Constants.EVENTS.DOWNLOAD_ARTIFACT_FINISH_EVENT + scope.artifact.uniqueId); } }); }; public static factory = ($window:any,cacheService:Sdc.Services.CacheService,EventListenerService:Services.EventListenerService, fileUtils:Sdc.Utils.FileUtils)=> { return new DownloadArtifactDirective($window,cacheService,EventListenerService, fileUtils); }; } DownloadArtifactDirective.factory.$inject = ['$window', 'Sdc.Services.CacheService', 'EventListenerService', 'FileUtils']; }