case JSON:
innerValidator = ToscaPropertyType.JSON.getValidator();
break;
+ case MAP:
+ innerValidator = ToscaPropertyType.MAP.getValidator();
+ break;
default:
log.debug("inner Tosca Type is unknown. {}", innerToscaType);
return false;
for (int i = 0; i < size; i++) {
JsonElement currentValue = jo.get(i);
String element = JsonUtils.toString(currentValue);
- if (!innerValidator.isValid(element, null, allDataTypes)) {
+ if (!innerValidator.isValid(element, innerToscaType.equals(ToscaPropertyType.MAP)? ToscaPropertyType.STRING.getType(): null, allDataTypes)) {
log.debug("validation of element : {} failed", element);
return false;
}
canBeDeclared: boolean;
mapKey: string;
mapKeyError: string;
+ mapInlist: boolean
constructor(property: PropertyBEModel, parentName?: string, createChildOfListOrMap?: boolean, key?:string, value?:any) {
if (!createChildOfListOrMap) { //creating a standard derived prop
this.mapKey = property.schema.property.type.split('.').pop();
this.mapKeyError = null;
this.type = property.schema.property.type;
+ if (this.type == PROPERTY_TYPES.MAP){
+ this.mapInlist = true;
+ }
+
+ this.schema = new SchemaPropertyGroupModel(new SchemaProperty(property.schema.property));
} else { //map
if (key) {
this.mapKey = key;
this.mapKeyError = 'Key cannot be empty.';
}
this.type = property.type;
+ if (property.schema.property.type == PROPERTY_TYPES.MAP){
+ const schProp = new SchemaProperty();
+ schProp.isSimpleType = true;
+ schProp.isDataType = false;
+ schProp.simpleType = PROPERTY_TYPES.STRING;
+ this.schema = new SchemaPropertyGroupModel(schProp);
+ this.schemaType = PROPERTY_TYPES.STRING;
+ } else {
+ this.schema = new SchemaPropertyGroupModel(new SchemaProperty(property.schema.property));
+ }
+
}
this.valueObj = (this.type == PROPERTY_TYPES.JSON && typeof value == 'object') ? JSON.stringify(value) : value;
- this.schema = new SchemaPropertyGroupModel(new SchemaProperty(property.schema.property));
this.updateValueObjOrig();
}
// this.constraints = property ? property.constraints : null;
public hasValueObjChanged() {
return !_.isEqual(this.valueObj, this.valueObjOrig);
}
+
}
export class DerivedFEPropertyMap {
[parentPath: string]: Array<DerivedFEProperty>;
_.set(this.valueObj, childPropName, null);
}
} else {
- _.set(this.valueObj, childPropName, childProp.valueObj);
+ _.set(this.valueObj, childPropName, childProp.valueObj);
}
if (childProp.valueObjIsChanged) {
_.set(this.valueObjValidation, childPropName, childProp.valueObjIsValid);
if (!childProp.isChildOfListOrMap || childProp.derivedDataType !== DerivedPropertyType.MAP) {
return;
}
-
const childParentNames = this.getParentNamesArray(childProp.parentName);
const oldActualMapKey = childProp.getActualMapKey();
let nameToInsert: string = parentProp.name;
if (parentProp.isChildOfListOrMap) {
- if (!noHashKeys && parentProp.derivedDataType == DerivedPropertyType.MAP) {
+ if (!noHashKeys && parentProp.derivedDataType == DerivedPropertyType.MAP && !parentProp.mapInlist) {
nameToInsert = parentProp.getActualMapKey();
} else { //LIST
let siblingProps = this.flattenedChildren.filter(prop => prop.parentName == parentProp.parentName).map(prop => prop.propertiesName);
<div class="table-cell" *ngIf="!canBeDeclared && !property.isChildOfListOrMap">
<div class="inner-cell-div" tooltip="{{property.name}}"><span>{{property.name}}</span></div>
</div> <!-- simple children of complex type within map or list -->
- <div class="table-cell map-entry" *ngIf="property.isChildOfListOrMap && propType == derivedPropertyTypes.MAP"><!-- map left cell -->
+ <div class="table-cell map-entry" *ngIf="property.isChildOfListOrMap && propType == derivedPropertyTypes.MAP && !property.mapInlist"><!-- map left cell -->
<dynamic-element #mapKeyInput
class="value-input"
pattern="validationUtils.getValidationPattern(string)"
</ng-container>
<!-- ICONS: add, delete, and expand -->
<ng-container *ngIf="!property.isDeclared && !property.isToscaGetFunction()">
- <a *ngIf="(propType == derivedPropertyTypes.LIST || propType == derivedPropertyTypes.MAP) && !property.isChildOfListOrMap" class="property-icon add-item" (click)="createNewChildProperty();" [ngClass]="{'disabled':readonly || preventInsertItem(property)}" [attr.data-tests-id]="'add-to-list-' + propertyTestsId">Add value to list</a>
+ <a *ngIf="(propType == derivedPropertyTypes.LIST) && (!property.isChildOfListOrMap || property.mapInlist)" class="property-icon add-item" (click)="createNewChildProperty();" [ngClass]="{'disabled':readonly || preventInsertItem(property)}" [attr.data-tests-id]="'add-to-list-' + propertyTestsId">Add value to list</a>
+ <a *ngIf="(propType == derivedPropertyTypes.MAP) && (!property.isChildOfListOrMap || property.mapInlist)" class="property-icon add-item" (click)="createNewChildProperty();" [ngClass]="{'disabled':readonly || preventInsertItem(property)}" [attr.data-tests-id]="'add-to-list-' + propertyTestsId">Add value to map</a>
<span *ngIf="property.isChildOfListOrMap" (click)="deleteItem.emit(property);" class="property-icon sprite-new delete-item-icon" [ngClass]="{'disabled':readonly}" [attr.data-tests-id]="'delete-from-list-' + propertyTestsId"></span>
<span *ngIf="!isPropertyFEModel && (propType == derivedPropertyTypes.COMPLEX || ((propType == derivedPropertyTypes.LIST || propType == derivedPropertyTypes.MAP) && hasChildren))" (click)="expandChildById(propPath)" class="property-icon sprite-new round-expand-icon" [class.open]="expandedChildId.indexOf(propPath) == 0" [attr.data-tests-id]="'expand-' + propertyTestsId" ></span>
</ng-container>
if (property.derivedDataType == DerivedPropertyType.LIST || property.derivedDataType == DerivedPropertyType.MAP) {
property.flattenedChildren = [];
Object.keys(property.valueObj).forEach((key) => {
- property.flattenedChildren.push(...this.createListOrMapChildren(property, key, property.valueObj[key]))
+ property.flattenedChildren.push(...this.createListOrMapChildren(property, key, property.valueObj[key]));
+ const lastCreatedChild = property.flattenedChildren.slice(-1)[0];
+ if (property.schemaType == PROPERTY_TYPES.MAP && property.valueObj[key]){
+ const nestedValue:object = property.valueObj[key];
+ Object.keys(nestedValue).forEach((keyNested) => {
+ property.flattenedChildren.push(...this.createListOrMapChildren(lastCreatedChild, keyNested, nestedValue[keyNested]));
+ });
+ };
});
} else if (property.derivedDataType === DerivedPropertyType.COMPLEX) {
property.flattenedChildren = this.createFlattenedChildren(property.type, property.name);