From 7565f810f9fa50c8140843b2f81e8fb428815154 Mon Sep 17 00:00:00 2001 From: imamSidero Date: Thu, 23 Mar 2023 11:25:23 +0000 Subject: Provide tosca function capability to all nested levels Tosca function capability is provided to all nested levels of list, map and custom types Issue-ID: SDC-4445 Signed-off-by: Imam hussain Change-Id: I29907bdac83d3cadf90aa0a2ed538002132b4789 --- .../dynamic-property.component.html | 4 +- .../dynamic-property/dynamic-property.component.ts | 76 +++++++++++++--------- .../properties-assignment.page.component.ts | 51 +++++---------- .../services/properties.utils.ts | 33 ++++++---- .../tosca-function/tosca-function.component.ts | 11 +--- .../tosca-get-function.component.ts | 35 +++++++--- .../src/app/ng2/services/data-type.service.ts | 14 +++- 7 files changed, 124 insertions(+), 100 deletions(-) (limited to 'catalog-ui/src/app/ng2') diff --git a/catalog-ui/src/app/ng2/components/logic/properties-table/dynamic-property/dynamic-property.component.html b/catalog-ui/src/app/ng2/components/logic/properties-table/dynamic-property/dynamic-property.component.html index 956bb05356..038f5f5317 100644 --- a/catalog-ui/src/app/ng2/components/logic/properties-table/dynamic-property/dynamic-property.component.html +++ b/catalog-ui/src/app/ng2/components/logic/properties-table/dynamic-property/dynamic-property.component.html @@ -25,7 +25,7 @@
{{property.name}}
- +
{{property.name}}
@@ -44,7 +44,7 @@
- + { - let mapKeyValue = this.property instanceof DerivedFEProperty ? this.property.mapKey : ""; let parentToscaFunction = null; - if (this.property.type == PROPERTY_TYPES.LIST && mapKeyValue === "") { - if (this.property.value != null) { - const valueJson = JSON.parse(this.property.value); - if (this.property instanceof PropertyFEModel && this.property.expandedChildPropertyId != null) { - let indexNumber = Number(Object.keys(valueJson).sort().reverse()[0]) + 1; - mapKeyValue = indexNumber.toString(); - }else{ - mapKeyValue = Object.keys(valueJson).sort().reverse()[0]; - } - }else { - mapKeyValue = "0"; - } - } if (this.property.type == PROPERTY_TYPES.MAP && this.property instanceof DerivedFEProperty && this.property.mapInlist) { parentToscaFunction = this.property.toscaFunction; this.property.toscaFunction = null; } - let newProps: Array = this.propertiesUtils.createListOrMapChildren(this.property, mapKeyValue, null); + let newProps: Array = this.propertiesUtils.createListOrMapChildren(this.property, '', null); this.propertiesUtils.assignFlattenedChildrenValues(this.property.valueObj, [newProps[0]], this.property.propertiesName); if (this.property instanceof PropertyFEModel) { @@ -257,21 +243,45 @@ export class DynamicPropertyComponent { return; } let oldKey = item.getActualMapKey(); - let keyIndex : number = 0; - if(item.parentMapKey != null && oldKey != null) { - keyIndex = 1; - } - if(item.parentMapKey != null && oldKey == null) { - oldKey = item.parentMapKey; - } if (this.property.subPropertyToscaFunctions !== null) { + let deletedIndex = item.toscaPath.length > 0 ? Number(item.toscaPath[item.toscaPath.length - 1]) : null; + let parentIndex = item.toscaPath.length > 1 ? item.toscaPath.splice(0,item.toscaPath.length - 2) : null; let tempSubToscaFunction: SubPropertyToscaFunction[] = []; + let toscaPathMap = new Map(); this.property.subPropertyToscaFunctions.forEach((subToscaItem : SubPropertyToscaFunction) => { - if(subToscaItem.subPropertyPath[keyIndex] != oldKey){ + if ((subToscaItem.subPropertyPath.toString()).indexOf(item.toscaPath.toString()) == -1) { tempSubToscaFunction.push(subToscaItem); + } else { + if (item.derivedDataType == DerivedPropertyType.LIST ) { + if (parentIndex != null) { + if ((subToscaItem.subPropertyPath.toString()).indexOf(parentIndex.toString()) != -1 + && subToscaItem.subPropertyPath.length > parentIndex.length) { + let nextIndex = Number(subToscaItem.subPropertyPath[parentIndex.length]); + if(!isNaN(nextIndex) && !isNaN(deletedIndex) && nextIndex > deletedIndex) { + let revisedPAth = subToscaItem.subPropertyPath; + revisedPAth[parentIndex.length] = (nextIndex - 1).toString(); + toscaPathMap.set(subToscaItem.subPropertyPath.toString(),revisedPAth.toString()); + } + } + } else { + if (subToscaItem.subPropertyPath.length == 1 && !isNaN(deletedIndex)) { + let nextElementIndex = Number(subToscaItem.subPropertyPath[0]); + if (!isNaN(nextElementIndex) && nextElementIndex > deletedIndex) { + subToscaItem.subPropertyPath[0] = (nextElementIndex - 1).toString(); + } + } + } + } } }); this.property.subPropertyToscaFunctions = tempSubToscaFunction; + if (item.derivedDataType == DerivedPropertyType.LIST && parentIndex != null && toscaPathMap.size > 0) { + this.property.flattenedChildren.forEach((childProperties : DerivedFEProperty) => { + if (toscaPathMap.has(childProperties.toscaPath.toString())) { + childProperties.toscaPath = toscaPathMap.get(childProperties.toscaPath.toString()); + } + }); + } } if (item.derivedDataType == DerivedPropertyType.MAP && !item.mapInlist) { delete itemParent.valueObj[oldKey]; @@ -299,16 +309,13 @@ export class DynamicPropertyComponent { updateChildKeyInParent(childProp: DerivedFEProperty, newMapKey: string) { if (this.property instanceof PropertyFEModel) { let oldKey = childProp.getActualMapKey(); + let oldToscaPath = childProp.toscaPath; this.property.childPropMapKeyUpdated(childProp, newMapKey); - this.property.flattenedChildren.forEach(tempDervObj => { - if (childProp.propertiesName === tempDervObj.parentName) { - tempDervObj.mapKey = newMapKey; - } - }); + this.updateChildMapKey(this.property.flattenedChildren, childProp.propertiesName, newMapKey); if (this.property.subPropertyToscaFunctions != null) { this.property.subPropertyToscaFunctions.forEach((item : SubPropertyToscaFunction) => { - if(item.subPropertyPath[0] === oldKey){ - item.subPropertyPath = [newMapKey]; + if(item.subPropertyPath === oldToscaPath){ + item.subPropertyPath = childProp.toscaPath; } }); } @@ -316,6 +323,15 @@ export class DynamicPropertyComponent { } } + updateChildMapKey(childProps: Array, parentName: string, newMapKey: string) { + childProps.forEach(tempDervObj => { + if (parentName === tempDervObj.parentName) { + tempDervObj.mapKey = newMapKey; + tempDervObj.toscaPath[tempDervObj.toscaPath.length - 2] = newMapKey; + } + }); + } + preventInsertItem = (property:DerivedFEProperty):boolean => { if(property.type == PROPERTY_TYPES.MAP && property.valueObj != null && Object.keys(property.valueObj).indexOf('') > -1 ){ return true; diff --git a/catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.ts b/catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.ts index 17bb1a63cc..0e3e13917a 100644 --- a/catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.ts +++ b/catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.ts @@ -585,6 +585,18 @@ export class PropertiesAssignmentComponent { modal.instance.open(); } + private deleteToscaValue(valueJson : any, currentKey: string[]) { + if(currentKey.length == 1) { + if (Array.isArray(valueJson) && !isNaN(Number(currentKey[0]))) { + valueJson.splice(Number(currentKey[0]),1); + } else { + delete valueJson[currentKey[0]]; + } + } else { + this.deleteToscaValue(valueJson[currentKey[0]],currentKey.splice(1,currentKey.length -1)); + } + } + private clearCheckedInstancePropertyValue() { const checkedInstanceProperty: PropertyBEModel = this.buildCheckedInstanceProperty(); const currentValue : any = checkedInstanceProperty.value; @@ -594,37 +606,15 @@ export class PropertiesAssignmentComponent { if (checkedInstanceProperty instanceof PropertyDeclareAPIModel && (checkedInstanceProperty).propertiesName){ const propertiesNameArray = (checkedInstanceProperty).propertiesName; const parts = propertiesNameArray.split("#"); - let currentKey = []; - if (this.isListOrMap(checkedInstanceProperty.type)) { - if (checkedInstanceProperty.schemaType == PROPERTY_TYPES.MAP) { - currentKey.push((checkedInstanceProperty.input).parentMapKey); - } - currentKey.push((checkedInstanceProperty.input).mapKey); - if (checkedInstanceProperty.schemaType != PROPERTY_TYPES.MAP && this.isComplexSchemaType(checkedInstanceProperty.schemaType)) { - currentKey.push(parts.reverse()[0]); - } - } + let currentKey = (checkedInstanceProperty.input).toscaPath; if (propertiesNameArray.length > 1){ const index = checkedInstanceProperty.subPropertyToscaFunctions.findIndex(existingSubPropertyToscaFunction => this.areEqual(existingSubPropertyToscaFunction.subPropertyPath, currentKey.length > 0 ? currentKey : parts.slice(1))); checkedInstanceProperty.subPropertyToscaFunctions.splice(index, 1); } if(currentValue !== null && currentKey.length > 0){ let valueJson = JSON.parse(currentValue); - if(currentKey.length >1){ - let innerObj = valueJson[currentKey[0]]; - delete innerObj[currentKey[1]]; - valueJson[currentKey[0]] = innerObj; - }else{ - delete valueJson[currentKey[0]]; - } - if (checkedInstanceProperty.type == PROPERTY_TYPES.LIST && currentKey.length == 1) { - let listValue = valueJson.filter(function (item) { - return item != null && item != ''; - }); - checkedInstanceProperty.value = JSON.stringify(listValue); - } else { - checkedInstanceProperty.value = JSON.stringify(valueJson); - } + this.deleteToscaValue(valueJson, currentKey); + checkedInstanceProperty.value = JSON.stringify(valueJson); } } if (this.selectedInstanceData instanceof ComponentInstance) { @@ -648,16 +638,7 @@ export class PropertiesAssignmentComponent { if (checkedProperty instanceof PropertyDeclareAPIModel && (checkedProperty).propertiesName){ const propertiesName = (checkedProperty).propertiesName; const parts = propertiesName.split("#"); - let currentKey = []; - if (this.isListOrMap(checkedProperty.type)) { - if (checkedProperty.schemaType == PROPERTY_TYPES.MAP) { - currentKey.push((checkedProperty.input).parentMapKey); - } - currentKey.push((checkedProperty.input).mapKey); - if (checkedProperty.schemaType != PROPERTY_TYPES.MAP && this.isComplexSchemaType(checkedProperty.schemaType)) { - currentKey.push(parts.reverse()[0]); - } - } + let currentKey = (checkedProperty.input).toscaPath; if (checkedProperty.subPropertyToscaFunctions == null){ checkedProperty.subPropertyToscaFunctions = []; } diff --git a/catalog-ui/src/app/ng2/pages/properties-assignment/services/properties.utils.ts b/catalog-ui/src/app/ng2/pages/properties-assignment/services/properties.utils.ts index bc5345c386..8dd4ca96ec 100644 --- a/catalog-ui/src/app/ng2/pages/properties-assignment/services/properties.utils.ts +++ b/catalog-ui/src/app/ng2/pages/properties-assignment/services/properties.utils.ts @@ -105,15 +105,14 @@ export class PropertiesUtils { newProps.push(parentProp); if (!property.schema.property.isSimpleType) { - let additionalChildren:Array = this.createFlattenedChildren(property.schema.property.type, parentProp.propertiesName, key); + let additionalChildren:Array = this.createFlattenedChildren(property.schema.property.type, parentProp.propertiesName, key, parentProp.toscaPath); this.assignFlattenedChildrenValues(parentProp.valueObj, additionalChildren, parentProp.propertiesName); additionalChildren.forEach(prop => { prop.canBeDeclared = false; if (property.subPropertyToscaFunctions != null) { const subToscaFunctArray : SubPropertyToscaFunction[] = property.subPropertyToscaFunctions; subToscaFunctArray.forEach(subToscaFunct => { - const keyArray : string[] = subToscaFunct.subPropertyPath; - if (keyArray.length > 1 && prop.mapKey == keyArray[0] && prop.name == keyArray[1]) { + if (subToscaFunct.subPropertyPath.toString() === prop.toscaPath.toString()) { prop.toscaFunction = subToscaFunct.toscaFunction; } }); @@ -128,13 +127,15 @@ export class PropertiesUtils { /** * Creates derivedFEProperties of a specified type and returns them. */ - private createFlattenedChildren = (type: string, parentName: string, key: string):Array => { + private createFlattenedChildren = (type: string, parentName: string, key: string, toscaPath?: string[]):Array => { let tempProps: Array = []; let dataTypeObj: DataTypeModel = this.dataTypeService.getDataTypeByTypeName(type); - this.dataTypeService.getDerivedDataTypeProperties(dataTypeObj, tempProps, parentName); - tempProps.forEach(tempDervObj => { - tempDervObj.mapKey = key; - }); + this.dataTypeService.getDerivedDataTypeProperties(dataTypeObj, tempProps, parentName, toscaPath); + if (key != '') { + tempProps.forEach(tempDervObj => { + tempDervObj.mapKey = key; + }); + } return _.sortBy(tempProps, ['propertiesName']); } @@ -161,6 +162,16 @@ export class PropertiesUtils { property.flattenedChildren.push(...this.createListOrMapChildren(lastCreatedChild, keyNested, nestedValue[keyNested])); }); } + if (property.flattenedChildren && property.subPropertyToscaFunctions) { + property.flattenedChildren.forEach((prop, index) => { + property.subPropertyToscaFunctions.forEach(subPropertyToscaFunction => { + const toscaFunctionPath = subPropertyToscaFunction.subPropertyPath.join('#'); + if (subPropertyToscaFunction.subPropertyPath.toString() === prop.toscaPath.toString()) { + prop.toscaFunction = subPropertyToscaFunction.toscaFunction; + } + }); + }); + } }); } else if (property.derivedDataType === DerivedPropertyType.COMPLEX) { property.flattenedChildren = this.createFlattenedChildren(property.type, property.name, ""); @@ -183,11 +194,11 @@ export class PropertiesUtils { const subPropertyPath = prop.propertiesName.substring(prop.propertiesName.indexOf(topLevelPropertyName) + topLevelPropertyName.length + 1); subPropertyToscaFunctions.forEach(subPropertyToscaFunction => { const toscaFunctionPath = subPropertyToscaFunction.subPropertyPath.join('#'); - if (subPropertyPath === toscaFunctionPath){ + if (subPropertyPath === toscaFunctionPath || subPropertyToscaFunction.subPropertyPath.toString() === prop.toscaPath.toString()) { prop.toscaFunction = subPropertyToscaFunction.toscaFunction; } - }) - }) + }); + }); } /* diff --git a/catalog-ui/src/app/ng2/pages/properties-assignment/tosca-function/tosca-function.component.ts b/catalog-ui/src/app/ng2/pages/properties-assignment/tosca-function/tosca-function.component.ts index 9ea0c8f214..d46ac2eb10 100644 --- a/catalog-ui/src/app/ng2/pages/properties-assignment/tosca-function/tosca-function.component.ts +++ b/catalog-ui/src/app/ng2/pages/properties-assignment/tosca-function/tosca-function.component.ts @@ -114,16 +114,7 @@ export class ToscaFunctionComponent implements OnInit, OnChanges { if (this.property instanceof PropertyDeclareAPIModel && this.property.subPropertyToscaFunctions && ( this.property).propertiesName){ let propertiesPath = ( this.property).propertiesName.split("#"); if (propertiesPath.length > 1){ - let keyToFind = []; - if (this.property.type == PROPERTY_TYPES.MAP || this.property.type == PROPERTY_TYPES.LIST) { - if (this.property.type == PROPERTY_TYPES.LIST && this.property.schemaType == PROPERTY_TYPES.MAP) { - keyToFind.push((this.property.input).parentMapKey); - } - keyToFind.push((this.property.input).mapKey); - if (this.property.schemaType != PROPERTY_TYPES.MAP && PROPERTY_DATA.SIMPLE_TYPES.indexOf(this.property.schemaType) === -1) { - keyToFind.push(propertiesPath.reverse()[0]); - } - } + let keyToFind = (this.property.input).toscaPath; let subPropertyToscaFunction = this.property.subPropertyToscaFunctions.find(subPropertyToscaFunction => this.areEqual(subPropertyToscaFunction.subPropertyPath, keyToFind.length > 0 ? keyToFind : propertiesPath.slice(1))); if (subPropertyToscaFunction){ diff --git a/catalog-ui/src/app/ng2/pages/properties-assignment/tosca-function/tosca-get-function/tosca-get-function.component.ts b/catalog-ui/src/app/ng2/pages/properties-assignment/tosca-function/tosca-get-function/tosca-get-function.component.ts index b0146cc1cf..656d7d6d71 100644 --- a/catalog-ui/src/app/ng2/pages/properties-assignment/tosca-function/tosca-get-function/tosca-get-function.component.ts +++ b/catalog-ui/src/app/ng2/pages/properties-assignment/tosca-function/tosca-get-function/tosca-get-function.component.ts @@ -264,11 +264,21 @@ export class ToscaGetFunctionComponent implements OnInit, OnChanges { private propertyTypeToString() { if (this.isSubProperty()){ - if ((this.typeHasSchema(this.property.type) && this.property instanceof PropertyDeclareAPIModel && - ( this.property).input instanceof DerivedFEProperty) || this.compositionMap) { + if ((this.property instanceof PropertyDeclareAPIModel && ( this.property).input instanceof DerivedFEProperty) + || this.compositionMap) { if(this.isComplexType(this.property.schemaType) && !this.compositionMap){ - let propertySchemaType = ( this.property).input.type; - return propertySchemaType == PROPERTY_TYPES.MAP ? PROPERTY_TYPES.STRING : propertySchemaType; + let mapChildProp : DerivedFEProperty = ( ( this.property).input); + let propertySchemaType = mapChildProp.type; + if (this.property.type == PROPERTY_TYPES.MAP || propertySchemaType == PROPERTY_TYPES.MAP) { + if (mapChildProp.mapKey != '' && mapChildProp.mapKey != null && mapChildProp.schema.property.type != null) { + propertySchemaType = mapChildProp.schema.property.type; + } + } + if ((propertySchemaType == PROPERTY_TYPES.MAP || (propertySchemaType == PROPERTY_TYPES.LIST && mapChildProp.schema.property.type == PROPERTY_TYPES.MAP)) + && mapChildProp.isChildOfListOrMap) { + propertySchemaType = PROPERTY_TYPES.STRING; + } + return propertySchemaType; }else{ return this.property.schema.property.type; } @@ -379,10 +389,13 @@ export class ToscaGetFunctionComponent implements OnInit, OnChanges { private hasSameType(property: PropertyBEModel | AttributeBEModel): boolean { if (this.typeHasSchema(this.property.type)) { if ((this.property instanceof PropertyDeclareAPIModel && ( this.property).input instanceof DerivedFEProperty) || this.compositionMap) { - if(this.isComplexType(this.property.schemaType) && !this.compositionMap){ - let propertySchemaType = ( this.property).input.type; - propertySchemaType = propertySchemaType == PROPERTY_TYPES.MAP ? PROPERTY_TYPES.STRING : propertySchemaType; - return property.type === propertySchemaType; + let childObject : DerivedFEProperty = (( this.property).input); + let childSchemaType = this.property.schemaType != null ? this.property.schemaType : childObject.type; + if(this.isComplexType(childSchemaType) && !this.compositionMap){ + if (childObject.type == PROPERTY_TYPES.MAP && childObject.isChildOfListOrMap) { + return property.type === PROPERTY_TYPES.STRING; + } + return property.type === childObject.type; }else{ return property.type === this.property.schema.property.type; } @@ -393,7 +406,11 @@ export class ToscaGetFunctionComponent implements OnInit, OnChanges { return property.type === this.property.type && this.property.schema.property.type === property.schema.property.type; } if (this.property.schema.property.isDataType && this.property instanceof PropertyDeclareAPIModel && (this.property).propertiesName){ - let typeToMatch = this.getType((this.property).propertiesName.split("#").slice(1), this.property.type); + let typeToMatch = ( this.property).input.type; + let childObject : DerivedFEProperty = (( this.property).input); + if (childObject.type == PROPERTY_TYPES.MAP && childObject.isChildOfListOrMap) { + typeToMatch = PROPERTY_TYPES.STRING; + } return property.type === typeToMatch; } diff --git a/catalog-ui/src/app/ng2/services/data-type.service.ts b/catalog-ui/src/app/ng2/services/data-type.service.ts index d4af634cec..6eead12134 100644 --- a/catalog-ui/src/app/ng2/services/data-type.service.ts +++ b/catalog-ui/src/app/ng2/services/data-type.service.ts @@ -140,16 +140,24 @@ export class DataTypeService { return null; } - public getDerivedDataTypeProperties(dataTypeObj: DataTypeModel, propertiesArray: Array, parentName: string) { + public getDerivedDataTypeProperties(dataTypeObj: DataTypeModel, propertiesArray: Array, parentName: string, toscaPath?: string[]) { //push all child properties to array + const parentToscaPath = toscaPath != null ? toscaPath.toString() : null; if (!dataTypeObj) return; if (dataTypeObj.properties) { dataTypeObj.properties.forEach((derivedProperty) => { + derivedProperty.parentToscaPath = parentToscaPath != null ? parentToscaPath.split(',') : []; + let innerToscaPath = null; if (dataTypeObj.name !== PROPERTY_DATA.OPENECOMP_ROOT || derivedProperty.name !== PROPERTY_DATA.SUPPLEMENTAL_DATA) {//The requirement is to not display the property supplemental_data - propertiesArray.push(new DerivedFEProperty(derivedProperty, parentName)); + const childProperty : DerivedFEProperty = new DerivedFEProperty(derivedProperty, parentName); + innerToscaPath = childProperty.toscaPath; + propertiesArray.push(childProperty); } + let derivedDataTypeObj: DataTypeModel = this.getDataTypeByTypeName(derivedProperty.type); - this.getDerivedDataTypeProperties(derivedDataTypeObj, propertiesArray, parentName + "#" + derivedProperty.name); + if (dataTypeObj && dataTypeObj.properties) { + this.getDerivedDataTypeProperties(derivedDataTypeObj, propertiesArray, parentName + "#" + derivedProperty.name, innerToscaPath); + } }); } //recurse parent (derivedFrom), in case one of parents contains properties -- cgit 1.2.3-korg