instantiationType,
ModalsHandler,
ResourceType,
- ValidationUtils
+ ValidationUtils,
+ FileUtils,
+ ServiceCsarReader
} from "app/utils";
import {EventListenerService, ProgressService} from "app/services";
import {CacheService, ElementService, ModelService, ImportVSPService, OnboardingService} from "app/services-ng2";
import {CATEGORY_SERVICE_METADATA_KEYS, PREVIOUS_CSAR_COMPONENT, DEFAULT_MODEL_NAME} from "../../../../utils/constants";
import {Observable} from "rxjs";
import {Model} from "../../../../models/model";
+import {SdcUiServices} from "onap-ui-angular/dist";
export class Validation {
componentNameValidationPattern:RegExp;
'VendorModelNumberValidationPattern',
'CommentValidationPattern',
'ValidationUtils',
+ 'FileUtils',
'sdcConfig',
'$state',
'ModalsHandler',
+ 'ModalServiceSdcUI',
'EventListenerService',
'Notification',
'Sdc.Services.ProgressService',
private VendorModelNumberValidationPattern:RegExp,
private CommentValidationPattern:RegExp,
private ValidationUtils:ValidationUtils,
+ private FileUtils: FileUtils,
private sdcConfig:IAppConfigurtaion,
private $state:ng.ui.IStateService,
private ModalsHandler:ModalsHandler,
+ private modalServiceSdcUI: SdcUiServices.ModalService,
private EventListenerService:EventListenerService,
private Notification:any,
private progressService:ProgressService,
this.initScope();
}
-
-
-
private initScopeValidation = ():void => {
this.$scope.validation = new Validation();
this.$scope.validation.componentNameValidationPattern = this.ComponentNameValidationPattern;
if(this.$stateParams.componentCsar && this.$scope.component.lifecycleState === 'NOT_CERTIFIED_CHECKIN' && !this.$scope.isCreateMode()) {
this.$scope.importedToscaBrowseFileText = this.$scope.originComponent.name + ' (' + (this.$scope.originComponent as Resource).csarVersion + ')';
} else {
- this.$scope.importedToscaBrowseFileText = onboardCsarFilesMap[csarUUID][csarVersion];
+ if (onboardCsarFilesMap && onboardCsarFilesMap[csarUUID]) {
+ this.$scope.importedToscaBrowseFileText = onboardCsarFilesMap[csarUUID][csarVersion];
+ }
}
}
}
if (resource.resourceType === ResourceType.VF && !resource.csarUUID) {
this.$scope.isShowFileBrowse = true;
}
- } else if(this.$scope.component.isService()){
+ } else if (this.$scope.component.isService()) {
let service: Service = <Service>this.$scope.component;
console.log(service.name + ": " + service.csarUUID);
- if (service.importedFile) { // Component has imported file.
+ if (service.importedFile) {
this.$scope.isShowFileBrowse = true;
- (<Service>this.$scope.component).serviceType = 'Service';
+ (<Service>this.$scope.component).ecompGeneratedNaming = true;
+ let blob = this.FileUtils.base64toBlob(service.importedFile.base64, "zip");
+ new ServiceCsarReader().read(blob).then(
+ (serviceCsar) => {
+ serviceCsar.serviceMetadata.contactId = this.cacheService.get("user").userId;
+ (<Service>this.$scope.component).setComponentMetadata(serviceCsar.serviceMetadata);
+ (<Service>this.$scope.component).model = serviceCsar.serviceMetadata.model;
+ this.$scope.onModelChange();
+ this.$scope.componentCategories.selectedCategory = serviceCsar.serviceMetadata.selectedCategory;
+ this.$scope.onCategoryChange();
+ serviceCsar.extraServiceMetadata.forEach((value: string, key: string) => {
+ if (this.getMetadataKey(key)) {
+ (<Service>this.$scope.component).categorySpecificMetadata[key] = value;
+ }
+ });
+ (<Service>this.$scope.component).derivedFromGenericType = serviceCsar.substitutionNodeType;
+ this.$scope.onBaseTypeChange();
+ },
+ (error) => {
+ const errorMsg = this.$filter('translate')('IMPORT_FAILURE_MESSAGE_TEXT');
+ console.error(errorMsg, error);
+ const errorDetails = {
+ 'Error': this.capitalize(error.reason),
+ 'Details': this.capitalize(error.message)
+ };
+ this.modalServiceSdcUI.openErrorDetailModal('Error', this.$filter('translate')('IMPORT_FAILURE_MESSAGE_TEXT'),
+ 'error-modal', errorDetails);
+ this.$state.go('dashboard');
+ });
}
if (this.$scope.isEditMode() && service.serviceType == 'Service' && !service.csarUUID) {
this.$scope.isShowFileBrowse = true;
this.$scope.isShowOnboardingSelectionBrowse = false;
}
-
//init file extensions based on the file that was imported.
if (this.$scope.component.isResource() && (<Resource>this.$scope.component).importedFile) {
let fileName:string = (<Resource>this.$scope.component).importedFile.filename;
//(<Resource>this.$scope.component).importedFile.filetype="csar";
}
-
-
this.$scope.setValidState(true);
this.$scope.calculateUnique = (mainCategory:string, subCategory:string):string => {
this.$scope.originComponent.contactId = this.$scope.component.contactId;
}
-
this.$scope.$on('$destroy', () => {
this.EventListenerService.unRegisterObserver(EVENTS.ON_LIFECYCLE_CHANGE_WITH_SAVE);
this.EventListenerService.unRegisterObserver(EVENTS.ON_LIFECYCLE_CHANGE);
};
+ private capitalize(s) {
+ return s && s[0].toUpperCase() + s.slice(1);
+ }
+
// Convert category string MainCategory_#_SubCategory to Array with one item (like the server except)
private convertCategoryStringToOneArray = ():IMainCategory[] => {
let tmp = this.$scope.component.selectedCategory.split("_#_");
return;
}
- if (!this.$scope.isCreateMode() && this.$scope.isVspImport()){
+ if (!this.$scope.isCreateMode() && this.$scope.isVspImport()) {
this.modelService.getModels().subscribe((modelsFound: Model[]) => {
modelsFound.sort().forEach(model => {
if (this.$scope.component.model != undefined) {
if (model.modelType == "NORMATIVE_EXTENSION") {
- this.$scope.component.model = model.derivedFrom;
+ if (this.$scope.component.model === model.name) {
+ this.$scope.component.model = model.derivedFrom;
+ }
this.$scope.models.push(model.derivedFrom)
} else {
- this.$scope.component.model = model.name;
this.$scope.models.push(model.name)
}
}
});
} else {
this.modelService.getModelsOfType("normative").subscribe((modelsFound: Model[]) => {
- modelsFound.sort().forEach(model => {this.$scope.models.push(model.name)});
+ modelsFound.sort().forEach(model => {
+ this.$scope.models.push(model.name)
+ });
});
}
};
const onSuccess = (validation:IValidate) => {
this.$scope.editForm['componentName'].$setValidity('nameExist', validation.isValid);
if (validation.isValid) {
- // update breadcrumb after changing name
- this.updateComponentNameInBreadcrumbs();
+ this.updateComponentNameInBreadcrumbs(); // update breadcrumb after changing name
+ } else {
+ this.$scope.editForm['componentName'].$setDirty();
}
};
}
};
-
this.EventListenerService.registerObserverCallback(EVENTS.ON_LIFECYCLE_CHANGE_WITH_SAVE, (nextState) => {
if (this.$state.current.data.unsavedChanges && this.$scope.isValidForm) {
this.$scope.save().then(() => {
});
this.$scope.onCategoryChange = (): void => {
+ if (!this.$scope.component.selectedCategory) {
+ this.$scope.editForm['category'].$setDirty();
+ }
+ if (!this.$scope.component.description) {
+ this.$scope.editForm['description'].$setDirty();
+ }
this.$scope.component.selectedCategory = this.$scope.componentCategories.selectedCategory;
if (this.$scope.component.selectedCategory) {
this.$scope.component.categories = this.convertCategoryStringToOneArray();
if (this.$scope.isCreateMode()) {
this.loadBaseTypes(data);
} else {
- let isValidForBaseType:boolean = false;
- data.baseTypes.forEach(baseType => {
- if (!this.$scope.component.derivedFromGenericType || baseType.toscaResourceName === this.$scope.component.derivedFromGenericType) {
- isValidForBaseType = true;
- }
+ let isValidForBaseType:boolean = data.baseTypes.some(baseType => {
+ return !this.$scope.component.derivedFromGenericType ||
+ baseType.toscaResourceName === this.$scope.component.derivedFromGenericType;
});
this.$scope.editForm['category'].$setValidity('validForBaseType', isValidForBaseType);
}
});
}
} else {
- this.$scope.baseTypes = [];
+ this.clearBaseTypes();
}
};
}
};
+ this.$scope.getCategoryDisplayNameOrName = (mainCategory: any): string => {
+ return mainCategory.displayName ? mainCategory.displayName : mainCategory.name ;
+ }
+
this.$scope.onBaseTypeChange = (): void => {
if (!this.$scope.component.derivedFromGenericType) {
this.$scope.component.derivedFromGenericVersion = undefined;
this.$scope.onModelChange = (): void => {
if (this.$scope.componentType === ComponentType.SERVICE && this.$scope.component && this.$scope.categories) {
let modelName = this.$scope.component.model ? this.$scope.component.model : null;
+ this.$scope.component.categories = undefined;
+ this.$scope.component.selectedCategory = undefined;
+ this.$scope.componentCategories.selectedCategory = undefined;
this.filterCategoriesByModel(modelName);
this.filterBaseTypesByModelAndCategory(modelName)
}
this.EventListenerService.registerObserverCallback(EVENTS.ON_LIFECYCLE_CHANGE, this.$scope.reload);
this.$scope.isMetadataKeyMandatory = (key: string): boolean => {
- let metadataKey = this.getMetadataKey(this.$scope.component.categories, key);
+ let metadataKey = this.getMetadataKey(key);
return metadataKey && metadataKey.mandatory;
}
this.$scope.getMetadataKeyValidValues = (key: string): string[] => {
- let metadataKey = this.getMetadataKey(this.$scope.component.categories, key);
+ let metadataKey = this.getMetadataKey(key);
if (metadataKey) {
return metadataKey.validValues;
}
}
this.$scope.getMetadataDisplayName = (key: string): string => {
- let metadataKey = this.getMetadataKey(this.$scope.component.categories, key);
+ let metadataKey = this.getMetadataKey(key);
if (metadataKey) {
return metadataKey.displayName ? metadataKey.displayName : metadataKey.name;
}
}
this.$scope.isMetadataKeyForComponentCategory = (key: string): boolean => {
- return this.getMetadataKey(this.$scope.component.categories, key) != null;
+ return this.getMetadataKey(key) != null;
}
this.$scope.isCategoryServiceMetadataKey = (key: string): boolean => {
}
this.$scope.isMetadataKeyForComponentCategoryService = (key: string, attribute: string): boolean => {
- let metadatakey = this.getMetadataKey(this.$scope.component.categories, key);
+ let metadatakey = this.getMetadataKey(key);
if (metadatakey && (!this.$scope.component[attribute] || !metadatakey.validValues.find(v => v === this.$scope.component[attribute]))) {
this.$scope.component[attribute] = metadatakey.defaultValue;
}
return metadatakey != null;
}
+
+ this.$scope.isNotApplicableMetadataKeys = (key: string): boolean => {
+ return this.$scope.component.categories && this.$scope.component.categories[0].notApplicableMetadataKeys && this.$scope.component.categories[0].notApplicableMetadataKeys.some(item => item === key);
+ }
}
private filterCategoriesByModel(modelName:string) {
// reload categories
this.$scope.initCategories();
this.$scope.categories = this.$scope.categories.filter(category =>
- !modelName ? category.models.indexOf(DEFAULT_MODEL_NAME) !== -1 : category.models !== null && category.models.indexOf(modelName) !== -1);
+ !modelName ? !category.models || category.models.indexOf(DEFAULT_MODEL_NAME) !== -1 : category.models !== null && category.models.indexOf(modelName) !== -1);
}
-
private filterBaseTypesByModelAndCategory(modelName:string) {
let categories = this.$scope.component.categories;
if (categories) {
this.elementService.getCategoryBaseTypes(categories[0].name, modelName).subscribe((data: ListBaseTypesResponse) => {
this.loadBaseTypes(data);
});
+ return;
}
+ this.clearBaseTypes();
}
private loadBaseTypes(baseTypeResponseList: ListBaseTypesResponse) {
this.$scope.isBaseTypeRequired = baseTypeResponseList.required;
this.$scope.baseTypes = [];
this.$scope.baseTypeVersions = [];
+ let defaultBaseType = baseTypeResponseList.defaultBaseType;
baseTypeResponseList.baseTypes.forEach(baseType => this.$scope.baseTypes.push(baseType.toscaResourceName));
- if (this.$scope.isBaseTypeRequired) {
- const baseType = baseTypeResponseList.baseTypes[0];
+ if (this.$scope.isBaseTypeRequired || defaultBaseType != null) {
+ let baseType = baseTypeResponseList.baseTypes[0];
+ if(defaultBaseType != null){
+ baseTypeResponseList.baseTypes.forEach(baseTypeObj => {
+ if(baseTypeObj.toscaResourceName == defaultBaseType) {
+ baseType = baseTypeObj;
+ }
+ });
+ }
+ if((<Service>this.$scope.component).derivedFromGenericType) {
+ baseTypeResponseList.baseTypes.forEach(baseTypeObj => {
+ if(baseTypeObj.toscaResourceName == (<Service>this.$scope.component).derivedFromGenericType) {
+ baseType = baseTypeObj;
+ }
+ });
+ }
baseType.versions.reverse().forEach(version => this.$scope.baseTypeVersions.push(version));
this.$scope.component.derivedFromGenericType = baseType.toscaResourceName;
this.$scope.component.derivedFromGenericVersion = this.$scope.baseTypeVersions[0];
this.$scope.showBaseTypeVersions = false;
}
+ private clearBaseTypes() {
+ this.$scope.isBaseTypeRequired = false;
+ this.$scope.baseTypes = [];
+ this.$scope.baseTypeVersions = [];
+ this.$scope.component.derivedFromGenericType = undefined;
+ this.$scope.component.derivedFromGenericVersion = undefined;
+ this.$scope.showBaseTypeVersions = false;
+ }
+
private setUnsavedChanges = (hasChanges: boolean): void => {
this.$state.current.data.unsavedChanges = hasChanges;
}
- private getMetadataKey(categories: IMainCategory[], key: string) : IMetadataKey {
- let metadataKey = this.getSubcategoryMetadataKey(this.$scope.component.categories, key);
- if (!metadataKey){
- return this.getCategoryMetadataKey(this.$scope.component.categories, key);
+ private getMetadataKey(key: string) : IMetadataKey {
+ if (this.$scope.component.categories) {
+ let metadataKey = this.getSubcategoryMetadataKey(this.$scope.component.categories, key);
+ if (!metadataKey){
+ return this.getCategoryMetadataKey(this.$scope.component.categories, key);
+ }
+ return metadataKey;
}
- return metadataKey;
+ return null;
}
private getSubcategoryMetadataKey(categories: IMainCategory[], key: string) : IMetadataKey {