summaryrefslogtreecommitdiffstats
path: root/catalog-ui/app/scripts/directives/download-artifact
diff options
context:
space:
mode:
Diffstat (limited to 'catalog-ui/app/scripts/directives/download-artifact')
-rw-r--r--catalog-ui/app/scripts/directives/download-artifact/download-artifact.ts141
1 files changed, 141 insertions, 0 deletions
diff --git a/catalog-ui/app/scripts/directives/download-artifact/download-artifact.ts b/catalog-ui/app/scripts/directives/download-artifact/download-artifact.ts
new file mode 100644
index 0000000000..49bf14618c
--- /dev/null
+++ b/catalog-ui/app/scripts/directives/download-artifact/download-artifact.ts
@@ -0,0 +1,141 @@
+/*-
+ * ============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=========================================================
+ */
+/// <reference path="../../references"/>
+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'];
+}