/*-
* ============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.ViewModels {
'use strict';
import Resource = Sdc.Models.Components.Resource;
export interface IEditArtifactModel {
artifactResource: Models.ArtifactModel;
artifactTypes: Array;
artifactFile: any;
}
export interface IArtifactResourceFormViewModelScope extends ng.IScope {
forms:any;
$$childTail: any;
isNew: boolean;
isLoading: boolean;
validationPattern: RegExp;
urlValidationPattern: RegExp;
labelValidationPattern: RegExp;
integerValidationPattern: RegExp;
commentValidationPattern: RegExp;
artifactType: string;
editArtifactResourceModel: IEditArtifactModel;
defaultHeatTimeout: number;
validExtensions: any;
originalArtifactName: string;
editForm: ng.IFormController;
footerButtons: Array;
modalInstanceArtifact:ng.ui.bootstrap.IModalServiceInstance;
fileExtensions():string;
save(doNotCloseModal?:boolean): void;
saveAndAnother(): void;
close(): void;
getOptions(): Array;
isDeploymentHeat(): boolean;
onFileChange(): void;
setDefaultTimeout(): void;
openEditEnvParametersModal(artifact:Models.ArtifactModel):void;
getFormTitle():string;
fileUploadRequired():string;
isArtifactOwner():boolean;
}
export class ArtifactResourceFormViewModel {
private artifactArr:Array;
static '$inject' = [
'$scope',
'$modalInstance',
'artifact',
'Sdc.Services.CacheService',
'ValidationPattern',
'UrlValidationPattern',
'LabelValidationPattern',
'IntegerValidationPattern',
'CommentValidationPattern',
'ValidationUtils',
'$base64',
'$state',
'ArtifactsUtils',
'$modal',
'$templateCache',
'component'
];
private formState:Utils.Constants.FormState;
private entityId:string;
constructor(private $scope:IArtifactResourceFormViewModelScope,
private $modalInstance:ng.ui.bootstrap.IModalServiceInstance,
private artifact:Models.ArtifactModel,
private cacheService:Services.CacheService,
private ValidationPattern:RegExp,
private UrlValidationPattern:RegExp,
private LabelValidationPattern:RegExp,
private IntegerValidationPattern : RegExp,
private CommentValidationPattern: RegExp,
private ValidationUtils: Sdc.Utils.ValidationUtils,
private $base64:any,
private $state:any,
private artifactsUtils:Sdc.Utils.ArtifactsUtils,
private $modal:ng.ui.bootstrap.IModalService,
private $templateCache:ng.ITemplateCacheService,
private component:Models.Components.Component) {
this.entityId = this.component.uniqueId;
this.artifactArr = [];
this.formState = angular.isDefined(artifact.artifactLabel) ? Utils.Constants.FormState.UPDATE : Utils.Constants.FormState.CREATE;
this.initScope();
}
private initEntity = ():void => {
this.$scope.editArtifactResourceModel.artifactResource = this.artifact;
this.$scope.originalArtifactName = this.artifact.artifactName;
};
private initFooterButtons = ():void =>{
this.$scope.footerButtons = [
{'name': 'Done', 'css': 'blue', 'callback': this.$scope.save}
];
if (this.$scope.isNew){
this.$scope.footerButtons.push( {'name': 'Add Another', 'css': 'grey', 'disabled': !this.$scope.isNew && 'deployment' === this.$scope.artifactType, 'callback': this.$scope.saveAndAnother});
}
};
private initArtifactTypes = ():void => {
let artifactTypes:any = this.cacheService.get('UIConfiguration');
if('deployment' === this.$scope.artifactType) {
this.$scope.validExtensions = ('HEAT_ENV' == this.artifact.artifactType||this.component.selectedInstance)?//to remove the first condition?
artifactTypes.artifacts.deployment.resourceInstanceDeploymentArtifacts
: this.component.isResource() ? artifactTypes.artifacts.deployment.resourceDeploymentArtifacts
: artifactTypes.artifacts.deployment.serviceDeploymentArtifacts;
if(this.$scope.validExtensions) {
this.$scope.editArtifactResourceModel.artifactTypes = Object.keys(this.$scope.validExtensions);
}
this.$scope.defaultHeatTimeout = artifactTypes.defaultHeatTimeout;
if(this.$scope.isNew) {
let isHeat='HEAT_ENV' == this.artifact.artifactType;
_.remove(this.$scope.editArtifactResourceModel.artifactTypes, (item:string)=> {
return 'HEAT' == item.substring(0,4)||(!isHeat && item == "VF_MODULES_METADATA") ||
_.has(Utils.Constants.ArtifactType.THIRD_PARTY_RESERVED_TYPES, item);
});
}
}if (this.$scope.artifactType === 'normal') {
this.$scope.editArtifactResourceModel.artifactTypes = artifactTypes.artifacts.other.map((element:any)=> {
return element.name;
});
_.remove(this.$scope.editArtifactResourceModel.artifactTypes, (item:string)=> {
return _.has(Utils.Constants.ArtifactType.THIRD_PARTY_RESERVED_TYPES, item) ||
_.has(Utils.Constants.ArtifactType.TOSCA, item);
})
}
if(this.component.isResource() && (this.component).isCsarComponent()) {
_.remove(this.$scope.editArtifactResourceModel.artifactTypes, (item:string) => {
return this.artifactsUtils.isLicenseType(item);
})
}
};
private initEditArtifactResourceModel = ():void => {
this.$scope.editArtifactResourceModel = {
artifactResource: null,
artifactTypes: null,
artifactFile:{}
};
this.initEntity();
};
private initScope = ():void => {
this.$scope.validationPattern = this.ValidationPattern;
this.$scope.urlValidationPattern = this.UrlValidationPattern;
this.$scope.labelValidationPattern = this.LabelValidationPattern;
this.$scope.integerValidationPattern = this.IntegerValidationPattern;
this.$scope.commentValidationPattern = this.CommentValidationPattern;
this.$scope.isLoading = false;
this.$scope.isNew = (this.formState === Utils.Constants.FormState.CREATE);
this.$scope.artifactType = this.artifactsUtils.getArtifactTypeByState(this.$state.current.name);
this.$scope.modalInstanceArtifact = this.$modalInstance;
this.initEditArtifactResourceModel();
this.initArtifactTypes();
// In case of edit, show the file name in browse.
if (this.artifact.artifactName!=="" && 'HEAT_ENV'!==this.artifact.artifactType){
this.$scope.editArtifactResourceModel.artifactFile = {};
this.$scope.editArtifactResourceModel.artifactFile.filename = this.artifact.artifactName;
}
//scope methods
this.$scope.isDeploymentHeat = ():boolean => {
return !this.$scope.isNew && this.$scope.artifactType === 'deployment' &&
'HEAT' === this.$scope.editArtifactResourceModel.artifactResource.artifactType.substring(0,4);
};
this.$scope.onFileChange = ():void => {
if(this.$scope.editArtifactResourceModel.artifactFile && this.$scope.editArtifactResourceModel.artifactFile.filename) {
this.$scope.editArtifactResourceModel.artifactResource.artifactName = this.$scope.editArtifactResourceModel.artifactFile.filename;
} else {
this.$scope.editArtifactResourceModel.artifactResource.artifactName = this.$scope.originalArtifactName;
}
};
this.$scope.setDefaultTimeout = ():void => {
if(this.$scope.isDeploymentHeat() && !this.$scope.editArtifactResourceModel.artifactResource.timeout) {
this.$scope.editArtifactResourceModel.artifactResource.timeout = this.$scope.defaultHeatTimeout;
}
};
this.$scope.fileExtensions = ():string => {
let type:string = this.$scope.editArtifactResourceModel.artifactResource.artifactType;
return type && this.$scope.validExtensions && this.$scope.validExtensions[type].acceptedTypes ?
this.$scope.validExtensions[type].acceptedTypes.join(',') : "";
};
this.$scope.save = (doNotCloseModal?:boolean):void => {
this.$scope.isLoading = true;
this.$scope.editArtifactResourceModel.artifactResource.description = this.ValidationUtils.stripAndSanitize(this.$scope.editArtifactResourceModel.artifactResource.description);
if (!this.$scope.isDeploymentHeat()) {
this.$scope.editArtifactResourceModel.artifactResource.timeout = null;
}
if (this.$scope.editArtifactResourceModel.artifactFile) {
this.$scope.editArtifactResourceModel.artifactResource.payloadData = this.$scope.editArtifactResourceModel.artifactFile.base64;
this.$scope.editArtifactResourceModel.artifactResource.artifactName = this.$scope.editArtifactResourceModel.artifactFile.filename;
}
let onFaild = (response):void => {
this.$scope.isLoading = false;
console.info('onFaild', response);
};
let onSuccess = (artifactResource:Models.ArtifactModel):void => {
this.$scope.isLoading = false;
this.$scope.originalArtifactName = "";
if(this.$scope.isDeploymentHeat()){
if(artifactResource.heatParameters) {
this.$scope.openEditEnvParametersModal(artifactResource);
}
}
if (!doNotCloseModal) {
this.$modalInstance.close();
//this.artifactArr = [];
} else {
this.$scope.editArtifactResourceModel.artifactFile = null;
angular.element("input[type='file']").val(null); // for support chrome when upload the same file
this.artifactsUtils.addAnotherAfterSave(this.$scope);
}
};
if('HEAT_ENV' == this.artifact.artifactType){
this.component.uploadInstanceEnvFile(this.$scope.editArtifactResourceModel.artifactResource).then(onSuccess, onFaild);
}else if(this.$scope.isArtifactOwner()){
this.component.addOrUpdateInstanceArtifact(this.$scope.editArtifactResourceModel.artifactResource).then(onSuccess, onFaild);
}else {
this.component.addOrUpdateArtifact(this.$scope.editArtifactResourceModel.artifactResource).then(onSuccess, onFaild);
}
};
this.$scope.isArtifactOwner = ():boolean=> {
return this.component.isService() && !!this.component.selectedInstance;
};
this.$scope.saveAndAnother = ():void => {
this.$scope.save(true);
};
this.$scope.close = ():void => {
this.$modalInstance.close();
this.artifactArr = [];
};
this.$scope.fileUploadRequired = ():string => {
if (this.$scope.editArtifactResourceModel.artifactFile.filename){
// This is edit mode
return 'false';
} else {
return 'true';
}
};
this.$scope.getFormTitle =(): string =>{
if('HEAT_ENV' == this.artifact.artifactType){
return 'Update HEAT ENV';
}
if(this.$scope.isDeploymentHeat()){
if(!this.$scope.editArtifactResourceModel.artifactResource.artifactChecksum){
return 'Add HEAT Template';
}
return 'Update HEAT Template';
}
if(this.$scope.isNew){
return 'Add Artifact';
}
return 'Update Artifact';
};
this.$scope.openEditEnvParametersModal = (artifactResource:Models.ArtifactModel):void => {
let modalOptions:ng.ui.bootstrap.IModalSettings = {
template: this.$templateCache.get('/app/scripts/view-models/forms/env-parameters-form/env-parameters-form.html'),
controller: 'Sdc.ViewModels.EnvParametersFormViewModel',
size: 'sdc-md',
backdrop: 'static',
resolve: {
artifact: ():Models.ArtifactModel => {
return artifactResource;
},
component: ():Models.Components.Component => {
return this.component;
}
}
};
let modalInstance:ng.ui.bootstrap.IModalServiceInstance = this.$modal.open(modalOptions);
modalInstance
.result
.then(():void => {
});
};
this.$scope.forms = {};
this.initFooterButtons();
this.$scope.$watch("forms.editForm.$invalid", (newVal, oldVal) => {
this.$scope.footerButtons[0].disabled = this.$scope.forms.editForm.$invalid;
if(this.$scope.isNew){
this.$scope.footerButtons[1].disabled = this.$scope.forms.editForm.$invalid;
}
});
}
}
}