2 import {ArtifactModel, Resource, Component} from "app/models";
3 import {ArtifactsUtils, FormState, ValidationUtils, ArtifactType} from "app/utils";
4 import {CacheService} from "app/services";
6 export interface IEditArtifactModel {
7 artifactResource:ArtifactModel;
8 artifactTypes:Array<string>;
12 export interface IArtifactResourceFormViewModelScope extends ng.IScope {
17 validationPattern:RegExp;
18 urlValidationPattern:RegExp;
19 labelValidationPattern:RegExp;
20 integerValidationPattern:RegExp;
21 commentValidationPattern:RegExp;
23 editArtifactResourceModel:IEditArtifactModel;
24 defaultHeatTimeout:number;
26 originalArtifactName:string;
27 editForm:ng.IFormController;
28 footerButtons:Array<any>;
29 modalInstanceArtifact:ng.ui.bootstrap.IModalServiceInstance;
31 fileExtensions():string;
32 save(doNotCloseModal?:boolean):void;
33 saveAndAnother():void;
35 getOptions():Array<string>;
36 isDeploymentHeat():boolean;
38 setDefaultTimeout():void;
39 openEditEnvParametersModal(artifact:ArtifactModel):void;
40 getFormTitle():string;
41 fileUploadRequired():string;
42 isArtifactOwner():boolean;
45 export class ArtifactResourceFormViewModel {
51 'Sdc.Services.CacheService',
53 'UrlValidationPattern',
54 'LabelValidationPattern',
55 'IntegerValidationPattern',
56 'CommentValidationPattern',
65 private formState:FormState;
66 private entityId:string;
68 constructor(private $scope:IArtifactResourceFormViewModelScope,
69 private $uibModalInstance:ng.ui.bootstrap.IModalServiceInstance,
70 private artifact:ArtifactModel,
71 private cacheService:CacheService,
72 private ValidationPattern:RegExp,
73 private UrlValidationPattern:RegExp,
74 private LabelValidationPattern:RegExp,
75 private IntegerValidationPattern:RegExp,
76 private CommentValidationPattern:RegExp,
77 private ValidationUtils:ValidationUtils,
80 private artifactsUtils:ArtifactsUtils,
81 private $uibModal:ng.ui.bootstrap.IModalService,
82 private component:Component) {
85 this.entityId = this.component.uniqueId;
86 this.formState = angular.isDefined(artifact.artifactLabel) ? FormState.UPDATE : FormState.CREATE;
90 private initEntity = ():void => {
91 this.$scope.editArtifactResourceModel.artifactResource = this.artifact;
92 this.$scope.originalArtifactName = this.artifact.artifactName;
96 private initFooterButtons = ():void => {
98 this.$scope.footerButtons = [
99 {'name': 'Done', 'css': 'blue', 'callback': this.$scope.save}
101 if (this.$scope.isNew) {
102 this.$scope.footerButtons.push({
103 'name': 'Add Another',
105 'disabled': !this.$scope.isNew && 'deployment' === this.$scope.artifactType,
106 'callback': this.$scope.saveAndAnother
111 private filterDeploymentArtifactTypeByResourceType = (resourceType:string):any => {
113 _.each(this.$scope.validExtensions, function (typeSettings:any, typeName:string) {
114 if (!typeSettings.validForResourceTypes || typeSettings.validForResourceTypes.indexOf(resourceType) > -1) {
115 result[typeName] = typeSettings;
122 private initArtifactTypes = ():void => {
124 let artifactTypes:any = this.cacheService.get('UIConfiguration');
126 if ('deployment' === this.$scope.artifactType) {
129 if ('HEAT_ENV' == this.artifact.artifactType || this.component.selectedInstance) {
130 this.$scope.validExtensions = artifactTypes.artifacts.deployment.resourceInstanceDeploymentArtifacts;
131 } else if (this.component.isResource()) {
132 this.$scope.validExtensions = artifactTypes.artifacts.deployment.resourceDeploymentArtifacts;
133 this.$scope.validExtensions = this.filterDeploymentArtifactTypeByResourceType((<Resource>this.component).resourceType);
135 this.$scope.validExtensions = artifactTypes.artifacts.deployment.serviceDeploymentArtifacts;
138 if (this.$scope.validExtensions) {
139 this.$scope.editArtifactResourceModel.artifactTypes = Object.keys(this.$scope.validExtensions);
141 this.$scope.defaultHeatTimeout = artifactTypes.defaultHeatTimeout;
142 if (this.$scope.isNew) {
143 let isHeat = 'HEAT_ENV' == this.artifact.artifactType;
144 _.remove(this.$scope.editArtifactResourceModel.artifactTypes, (item:string)=> {
145 return 'HEAT' == item.substring(0, 4) || (!isHeat && item == "VF_MODULES_METADATA") ||
146 _.has(ArtifactType.THIRD_PARTY_RESERVED_TYPES, item);
151 if (this.$scope.artifactType === 'informational') {
152 this.$scope.editArtifactResourceModel.artifactTypes = artifactTypes.artifacts.other.map((element:any)=> {
155 _.remove(this.$scope.editArtifactResourceModel.artifactTypes, (item:string)=> {
156 return _.has(ArtifactType.THIRD_PARTY_RESERVED_TYPES, item) ||
157 _.has(ArtifactType.TOSCA, item);
161 if (this.component.isResource() && (<Resource>this.component).isCsarComponent()) {
162 _.remove(this.$scope.editArtifactResourceModel.artifactTypes, (item:string) => {
163 return this.artifactsUtils.isLicenseType(item);
169 private initEditArtifactResourceModel = ():void => {
170 this.$scope.editArtifactResourceModel = {
171 artifactResource: null,
179 private initScope = ():void => {
181 this.$scope.validationPattern = this.ValidationPattern;
182 this.$scope.urlValidationPattern = this.UrlValidationPattern;
183 this.$scope.labelValidationPattern = this.LabelValidationPattern;
184 this.$scope.integerValidationPattern = this.IntegerValidationPattern;
185 this.$scope.commentValidationPattern = this.CommentValidationPattern;
186 this.$scope.isLoading = false;
187 this.$scope.isNew = (this.formState === FormState.CREATE);
188 this.$scope.artifactType = this.artifactsUtils.getArtifactTypeByState(this.$state.current.name);
189 this.$scope.modalInstanceArtifact = this.$uibModalInstance;
191 this.initEditArtifactResourceModel();
192 this.initArtifactTypes();
194 // In case of edit, show the file name in browse.
195 if (this.artifact.artifactName !== "" && 'HEAT_ENV' !== this.artifact.artifactType) {
196 this.$scope.editArtifactResourceModel.artifactFile = {};
197 this.$scope.editArtifactResourceModel.artifactFile.filename = this.artifact.artifactName;
201 this.$scope.isDeploymentHeat = ():boolean => {
202 return !this.$scope.isNew && this.$scope.artifactType === 'deployment'
203 && this.$scope.editArtifactResourceModel.artifactResource.isHEAT();
206 this.$scope.onFileChange = ():void => {
207 if (this.$scope.editArtifactResourceModel.artifactFile && this.$scope.editArtifactResourceModel.artifactFile.filename) {
208 this.$scope.editArtifactResourceModel.artifactResource.artifactName = this.$scope.editArtifactResourceModel.artifactFile.filename;
210 this.$scope.editArtifactResourceModel.artifactResource.artifactName = this.$scope.originalArtifactName;
213 this.$scope.setDefaultTimeout = ():void => {
214 if (this.$scope.isDeploymentHeat() && !this.$scope.editArtifactResourceModel.artifactResource.timeout) {
215 this.$scope.editArtifactResourceModel.artifactResource.timeout = this.$scope.defaultHeatTimeout;
218 if (this.$scope.editArtifactResourceModel.artifactFile.filename) {
219 this.$scope.editArtifactResourceModel.artifactFile = {};
220 this.$scope.forms.editForm.myArtifactFile.$setValidity('required', false);
224 this.$scope.fileExtensions = ():string => {
225 let type:string = this.$scope.editArtifactResourceModel.artifactResource.artifactType;
226 return type && this.$scope.validExtensions && this.$scope.validExtensions[type].acceptedTypes ?
227 this.$scope.validExtensions[type].acceptedTypes.join(',') : "";
230 this.$scope.save = (doNotCloseModal?:boolean):void => {
231 this.$scope.isLoading = true;
232 this.$scope.editArtifactResourceModel.artifactResource.description = this.ValidationUtils.stripAndSanitize(this.$scope.editArtifactResourceModel.artifactResource.description);
234 if (!this.$scope.isDeploymentHeat()) {
235 this.$scope.editArtifactResourceModel.artifactResource.timeout = null;
238 if (this.$scope.editArtifactResourceModel.artifactFile) {
239 this.$scope.editArtifactResourceModel.artifactResource.payloadData = this.$scope.editArtifactResourceModel.artifactFile.base64;
240 this.$scope.editArtifactResourceModel.artifactResource.artifactName = this.$scope.editArtifactResourceModel.artifactFile.filename;
243 let onFaild = (response):void => {
244 this.$scope.isLoading = false;
245 console.info('onFaild', response);
248 let onSuccess = (artifactResource:ArtifactModel):void => {
249 this.$scope.isLoading = false;
250 this.$scope.originalArtifactName = "";
252 if (this.$scope.isDeploymentHeat()) {
253 if (artifactResource.heatParameters) {
254 this.$scope.openEditEnvParametersModal(artifactResource);
258 if (!doNotCloseModal) {
259 this.$uibModalInstance.close();
261 this.$scope.editArtifactResourceModel.artifactFile = null;
262 angular.element("input[type='file']").val(null); // for support chrome when upload the same file
263 this.artifactsUtils.addAnotherAfterSave(this.$scope);
268 if ('HEAT_ENV' == this.artifact.artifactType) {
269 if (this.component.selectedInstance) {
270 this.component.uploadInstanceEnvFile(this.$scope.editArtifactResourceModel.artifactResource).then(onSuccess, onFaild);
272 this.component.addOrUpdateArtifact(this.$scope.editArtifactResourceModel.artifactResource).then(onSuccess, onFaild);
275 } else if (this.$scope.isArtifactOwner()) {
276 this.component.addOrUpdateInstanceArtifact(this.$scope.editArtifactResourceModel.artifactResource).then(onSuccess, onFaild);
278 this.component.addOrUpdateArtifact(this.$scope.editArtifactResourceModel.artifactResource).then(onSuccess, onFaild);
282 this.$scope.isArtifactOwner = ():boolean=> {
283 return this.component.isService() && !!this.component.selectedInstance;
286 this.$scope.saveAndAnother = ():void => {
287 this.$scope.save(true);
290 this.$scope.close = ():void => {
291 this.$uibModalInstance.close();
294 this.$scope.fileUploadRequired = ():string => {
295 if (this.$scope.editArtifactResourceModel.artifactFile.filename) {
303 this.$scope.getFormTitle = ():string => {
304 if ('HEAT_ENV' == this.artifact.artifactType) {
305 return 'Update HEAT ENV';
307 if (this.$scope.isDeploymentHeat()) {
308 if (!this.$scope.editArtifactResourceModel.artifactResource.artifactChecksum) {
309 return 'Add HEAT Template';
311 return 'Update HEAT Template';
313 if (this.$scope.isNew) {
314 return 'Add Artifact';
316 return 'Update Artifact';
319 this.$scope.openEditEnvParametersModal = (artifactResource:ArtifactModel):void => {
321 let modalOptions:ng.ui.bootstrap.IModalSettings = {
322 templateUrl: '../env-parameters-form/env-parameters-form.html',
323 controller: 'Sdc.ViewModels.EnvParametersFormViewModel',
327 artifact: ():ArtifactModel => {
328 return artifactResource;
330 component: ():Component => {
331 return this.component;
336 let modalInstance:ng.ui.bootstrap.IModalServiceInstance = this.$uibModal.open(modalOptions);
343 this.$scope.forms = {};
345 this.initFooterButtons();
348 this.$scope.$watch("forms.editForm.$invalid", (newVal, oldVal) => {
349 if(this.$scope.forms.editForm) {
350 this.$scope.footerButtons[0].disabled = this.$scope.forms.editForm.$invalid;
351 if (this.$scope.isNew) {
352 this.$scope.footerButtons[1].disabled = this.$scope.forms.editForm.$invalid;