aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorimamSidero <imam.hussain@est.tech>2023-01-24 16:03:54 +0000
committerMichael Morris <michael.morris@est.tech>2023-01-27 18:22:19 +0000
commit43ffce5d0d30872446c51afaf786d5cfad4378be (patch)
treec5ccdb92091586525b0b567f591c402ee642aecf
parente3a17890903ee443d0b5d0ee872e316e4369318d (diff)
Provide add/edit constraints capability to inputs in properties page
Providing the capability to add or edit constraints to inputs in properies of a service Issue-ID: SDC-4346 Signed-off-by: Imam hussain <imam.hussain@est.tech> Change-Id: I56261441022751a191fe057aafa4c681c8db96c5
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java3
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java3
-rw-r--r--catalog-ui/src/app/models/properties.ts5
-rw-r--r--catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.html2
-rw-r--r--catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.ts44
-rw-r--r--catalog-ui/src/app/ng2/pages/composition/panel/panel-tabs/properties-tab/properties-tab.component.ts2
-rw-r--r--catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.html2
-rw-r--r--catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.ts5
-rw-r--r--catalog-ui/src/app/utils/modals-handler.ts13
-rw-r--r--catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view-model.ts34
-rw-r--r--catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view.html8
-rw-r--r--integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentInputTab.java2
12 files changed, 103 insertions, 20 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java
index 21327ea29d..44fecb311b 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java
@@ -308,6 +308,9 @@ public class InputsBusinessLogic extends BaseBusinessLogic {
currInput.setDefaultValue(updateInputObjectValue);
currInput.setOwnerId(userId);
currInput.setMetadata(newInput.getMetadata());
+ if (newInput.getConstraints() != null) {
+ currInput.setConstraints(newInput.getConstraints());
+ }
if (newInput.isRequired() != null) {
currInput.setRequired(newInput.isRequired());
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
index 2cccc31ded..f5db6be6bd 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
@@ -2113,7 +2113,8 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
}
Service service = serviceResultEither.left().value();
if (dataParamsToReturn.contains(ComponentFieldsEnum.INPUTS.getValue())) {
- ListUtils.emptyIfNull(service.getInputs()).forEach(input -> input.setConstraints(setInputConstraint(input)));
+ ListUtils.emptyIfNull(service.getInputs()).stream().filter(input -> CollectionUtils.isEmpty(input.getConstraints()))
+ .forEach(input -> input.setConstraints(setInputConstraint(input)));
}
UiComponentDataTransfer dataTransfer = uiComponentDataConverter.getUiDataTransferFromServiceByParams(service, dataParamsToReturn);
return Either.left(dataTransfer);
diff --git a/catalog-ui/src/app/models/properties.ts b/catalog-ui/src/app/models/properties.ts
index 65158de23d..80575c4221 100644
--- a/catalog-ui/src/app/models/properties.ts
+++ b/catalog-ui/src/app/models/properties.ts
@@ -89,12 +89,12 @@ export class PropertyModel extends PropertyBEModel implements IPropertyModel {
filterTerm:string;
isAlreadySelected:boolean;
addOn:string;
-
+ propertyView: boolean = false;
constructor(property?:PropertyModel) {
super(property);
if (property) {
- // this.constraints = property.constraints;
+ this.constraints = property.constraints;
this.source = property.source;
this.valueUniqueUid = property.valueUniqueUid;
this.path = property.path;
@@ -105,6 +105,7 @@ export class PropertyModel extends PropertyBEModel implements IPropertyModel {
this.componentInstanceId = property.componentInstanceId;
this.parentValue = property.parentValue;
this.ownerId = property.ownerId;
+ this.propertyView = property.propertyView;
}
if (!this.schema || !this.schema.property) {
diff --git a/catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.html b/catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.html
index 7c83c55ae6..1389c21bcd 100644
--- a/catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.html
+++ b/catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.html
@@ -44,7 +44,7 @@
<!-- Property Name -->
<div class="table-cell col1">
<div class="inner-cell-div">
- <span class="property-name" tooltip="{{input.name}}">{{input.name}}</span>
+ <a class="property-name" (click)="updateProperty(input)" tooltip="{{input.name}}">{{input.name}}</a>
</div>
<span *ngIf="input.description"
class="property-description-icon sprite-new show-desc"
diff --git a/catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.ts b/catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.ts
index 822d8c9cdd..ec18767183 100644
--- a/catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.ts
+++ b/catalog-ui/src/app/ng2/components/logic/inputs-table/inputs-table.component.ts
@@ -23,7 +23,8 @@
* Created by rc2122 on 5/4/2017.
*/
import { Component, Input, Output, EventEmitter, ViewChildren, QueryList } from "@angular/core";
-import { InputFEModel } from "app/models";
+import { InputFEModel, PropertyModel, PropertiesGroup, Component as ComponentData } from "app/models";
+import { ModalsHandler } from 'app/utils';
import { ModalService } from "../../../services/modal.service";
import { InstanceFeDetails } from "app/models/instance-fe-details";
import { InstanceFePropertiesMap } from "../../../../models/properties-inputs/property-fe-map";
@@ -48,6 +49,8 @@ export class InputsTableComponent {
@Output() deleteInput: EventEmitter<any> = new EventEmitter<any>();
@Input() fePropertiesMap: InstanceFePropertiesMap;
+ @Input() componentInstancePropertyMap: PropertiesGroup;
+ @Input() parentComponent: ComponentData;
@ViewChildren('metadataViewChildren') public metadataViewChildren: QueryList<DynamicElementComponent>;
@@ -84,7 +87,7 @@ export class InputsTableComponent {
};
- constructor(private modalService: ModalService, private dataTypeService: DataTypeService){
+ constructor(private modalService: ModalService, private dataTypeService: DataTypeService, private modalsHandler: ModalsHandler){
var x = 5
}
@@ -175,6 +178,43 @@ export class InputsTableComponent {
return false;
}
+ public updateProperty = (inputProperty: InputFEModel): void => {
+ let modelProperty : PropertyModel = this.createPropertyModel(inputProperty);
+ if (inputProperty.instanceUniqueId != null && this.componentInstancePropertyMap != null && modelProperty.constraints == null) {
+ this.componentInstancePropertyMap[inputProperty.instanceUniqueId].forEach(tempProperty => {
+ modelProperty.constraints = tempProperty.constraints;
+ });
+ }
+ this.modalsHandler.newOpenEditPropertyModal(modelProperty, [],true, 'component', modelProperty.resourceInstanceUniqueId, this.parentComponent, inputProperty);
+ }
+
+ private createPropertyModel(inputproperty: InputFEModel){
+ let propertyModel = new PropertyModel();
+ propertyModel.constraints = inputproperty.constraints;
+ propertyModel.defaultValue = inputproperty.defaultValue;
+ propertyModel.definition = inputproperty.definition;
+ propertyModel.description = inputproperty.description;
+ propertyModel.name = inputproperty.name;
+ propertyModel.parentUniqueId = inputproperty.parentUniqueId;
+ propertyModel.password = inputproperty.password;
+ propertyModel.required = inputproperty.required;
+ propertyModel.schema = inputproperty.schema;
+ propertyModel.schemaType = inputproperty.schemaType;
+ propertyModel.type = inputproperty.type;
+ propertyModel.uniqueId = inputproperty.uniqueId;
+ propertyModel.value = inputproperty.value;
+ propertyModel.getInputValues = inputproperty.getInputValues;
+ propertyModel.parentPropertyType = inputproperty.parentPropertyType;
+ propertyModel.subPropertyInputPath = inputproperty.subPropertyInputPath;
+ propertyModel.getPolicyValues = inputproperty.getPolicyValues;
+ propertyModel.inputPath = inputproperty.inputPath;
+ propertyModel.metadata = inputproperty.metadata;
+ propertyModel.subPropertyToscaFunctions = inputproperty.subPropertyToscaFunctions;
+ propertyModel.ownerId = inputproperty.ownerId;
+ propertyModel.propertyView = true;
+ return propertyModel;
+ }
+
}
diff --git a/catalog-ui/src/app/ng2/pages/composition/panel/panel-tabs/properties-tab/properties-tab.component.ts b/catalog-ui/src/app/ng2/pages/composition/panel/panel-tabs/properties-tab/properties-tab.component.ts
index 04bed37e37..d25daf2865 100644
--- a/catalog-ui/src/app/ng2/pages/composition/panel/panel-tabs/properties-tab/properties-tab.component.ts
+++ b/catalog-ui/src/app/ng2/pages/composition/panel/panel-tabs/properties-tab/properties-tab.component.ts
@@ -230,7 +230,7 @@ export class PropertiesTabComponent implements OnInit {
(this.isPropertyOwner() ?
this.properties[property.parentUniqueId] :
this.properties[property.resourceInstanceUniqueId]) || [],
- this.isPropertyValueOwner(), 'component', property.resourceInstanceUniqueId).then((updatedProperty: PropertyModel) => {
+ this.isPropertyValueOwner(), 'component', property.resourceInstanceUniqueId, null, null).then((updatedProperty: PropertyModel) => {
if (updatedProperty) {
const oldProp = _.find(this.properties[updatedProperty.resourceInstanceUniqueId],
(prop: PropertyModel) => prop.uniqueId === updatedProperty.uniqueId);
diff --git a/catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.html b/catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.html
index 1be3495510..1eed6dfba1 100644
--- a/catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.html
+++ b/catalog-ui/src/app/ng2/pages/properties-assignment/properties-assignment.page.component.html
@@ -48,8 +48,10 @@
[showDelete]="!isReadOnly && isSelf()"
[inputs]="inputs | searchFilter:'name':searchQuery"
[instanceNamesMap]="componentInstanceNamesMap"
+ [componentInstancePropertyMap]="componentInstancePropertyMap"
[isLoading]="loadingInputs"
[componentType]="component.componentType"
+ [parentComponent]="component"
(deleteInput)="deleteInput($event)"
(inputChanged)="dataChanged($event)">
</inputs-table>
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 a3477792cf..e66de41f09 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
@@ -39,7 +39,8 @@ import {
PropertyFEModel,
Service,
SimpleFlatProperty,
- PropertyDeclareAPIModel
+ PropertyDeclareAPIModel,
+ PropertiesGroup
} from "app/models";
import {ResourceType} from "app/utils";
import {ComponentServiceNg2} from "../../services/component-services/component.service";
@@ -121,6 +122,7 @@ export class PropertiesAssignmentComponent {
serviceBePropertiesMap: InstanceBePropertiesMap;
serviceBeCapabilitiesPropertiesMap: InstanceBePropertiesMap;
selectedInstance_FlattenCapabilitiesList: Capability[];
+ componentInstancePropertyMap : PropertiesGroup;
@ViewChild('hierarchyNavTabs') hierarchyNavTabs: Tabs;
@ViewChild('propertyInputTabs') propertyInputTabs: Tabs;
@@ -170,6 +172,7 @@ export class PropertiesAssignmentComponent {
this.inputsUtils.resetInputDefaultValue(newInput, input.defaultValue);
this.inputs.push(newInput); //only push items that were declared via SDC
});
+ this.componentInstancePropertyMap = response.componentInstancesProperties;
this.loadingInputs = false;
}, error => {
diff --git a/catalog-ui/src/app/utils/modals-handler.ts b/catalog-ui/src/app/utils/modals-handler.ts
index cbbab45e9c..43f963737b 100644
--- a/catalog-ui/src/app/utils/modals-handler.ts
+++ b/catalog-ui/src/app/utils/modals-handler.ts
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-import { Component, DisplayModule , PropertyModel } from '../models';
+import { Component, DisplayModule , PropertyModel, InputFEModel } from '../models';
import { ComponentMetadata } from '../models/component-metadata';
export interface IModalsHandler {
@@ -97,6 +97,9 @@ export class ModalsHandler implements IModalsHandler {
},
isViewOnly: (): boolean => {
return isViewOnly;
+ },
+ inputProperty: (): InputFEModel => {
+ return null;
}
}
};
@@ -115,7 +118,7 @@ export class ModalsHandler implements IModalsHandler {
* @param isPropertyValueOwner - boolean telling if the component is eligible of editing the property
* @returns {IPromise<T>} - Promise telling if the modal has opened or not
*/
- newOpenEditPropertyModal = (property: PropertyModel, filteredProperties: PropertyModel[], isPropertyValueOwner: boolean, propertyOwnerType: string, propertyOwnerId: string): ng.IPromise<any> => {
+ newOpenEditPropertyModal = (property: PropertyModel, filteredProperties: PropertyModel[], isPropertyValueOwner: boolean, propertyOwnerType: string, propertyOwnerId: string, component: Component, inputProperty: InputFEModel): ng.IPromise<any> => {
const deferred = this.$q.defer();
const modalOptions: ng.ui.bootstrap.IModalSettings = {
@@ -142,6 +145,12 @@ export class ModalsHandler implements IModalsHandler {
},
isViewOnly: (): boolean => {
return false;
+ },
+ component: (): Component => {
+ return component as Component;
+ },
+ inputProperty: (): InputFEModel => {
+ return inputProperty;
}
}
};
diff --git a/catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view-model.ts b/catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view-model.ts
index 151c34f31a..c20d9fc408 100644
--- a/catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view-model.ts
+++ b/catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view-model.ts
@@ -22,9 +22,10 @@
import * as _ from "lodash";
import {FormState, PROPERTY_DATA, PROPERTY_TYPES, PROPERTY_VALUE_CONSTRAINTS, ValidationUtils} from "app/utils";
import {DataTypesService} from "app/services";
-import {DataTypesMap, PropertyModel} from "app/models";
+import {DataTypesMap, PropertyModel, InputBEModel, Component, InputFEModel} from "app/models";
import {ComponentInstance} from "../../../../models/componentsInstances/componentInstance";
import {ComponentInstanceServiceNg2} from "app/ng2/services/component-instance-services/component-instance.service";
+import {ComponentServiceNg2} from "app/ng2/services/component-services/component.service";
import {SdcUiCommon, SdcUiComponents, SdcUiServices} from "onap-ui-angular";
import {CompositionService} from "app/ng2/pages/composition/composition.service";
import {WorkspaceService} from "app/ng2/pages/workspace/workspace.service";
@@ -99,7 +100,7 @@ export class PropertyFormViewModel {
'PropertyNameValidationPattern',
'CommentValidationPattern',
'ValidationUtils',
- // 'component',
+ 'component',
'$filter',
'ModalServiceSdcUI',
'filteredProperties',
@@ -109,9 +110,11 @@ export class PropertyFormViewModel {
'propertyOwnerType',
'propertyOwnerId',
'ComponentInstanceServiceNg2',
+ 'ComponentServiceNg2',
'TopologyTemplateService',
'CompositionService',
- 'workspaceService'
+ 'workspaceService',
+ 'inputProperty'
];
private formState:FormState;
@@ -124,7 +127,7 @@ export class PropertyFormViewModel {
private PropertyNameValidationPattern:RegExp,
private CommentValidationPattern:RegExp,
private ValidationUtils:ValidationUtils,
- // private component:Component,
+ private component:Component,
private $filter:ng.IFilterService,
private modalService:SdcUiServices.ModalService,
private filteredProperties:Array<PropertyModel>,
@@ -134,9 +137,11 @@ export class PropertyFormViewModel {
private propertyOwnerType:string,
private propertyOwnerId:string,
private ComponentInstanceServiceNg2: ComponentInstanceServiceNg2,
+ private ComponentServiceNg2: ComponentServiceNg2,
private topologyTemplateService: TopologyTemplateService,
private compositionService: CompositionService,
- private workspaceService: WorkspaceService) {
+ private workspaceService: WorkspaceService,
+ private inputProperty : InputFEModel) {
this.formState = angular.isDefined(property.name) ? FormState.UPDATE : FormState.CREATE;
this.initScope();
@@ -322,6 +327,25 @@ export class PropertyFormViewModel {
//scope methods
this.$scope.save = (doNotCloseModal?:boolean):void => {
let property:PropertyModel = this.$scope.editPropertyModel.property;
+ this.$scope.isLoading = true;
+ if (property.propertyView){
+ if (property.constraints.length == 0) {
+ return;
+ }
+ let input : InputBEModel = this.inputProperty;
+ input.constraints = property.constraints;
+ this.ComponentServiceNg2.updateComponentInputs(this.component, [input]).subscribe(
+ (response) => {
+ console.debug("Input property updated");
+ this.$uibModalInstance.close();
+ },
+ (error) => {
+ console.debug("Failed to update input property");
+ this.$uibModalInstance.close();
+ }
+ );
+ return;
+ }
this.$scope.editPropertyModel.property.description = this.ValidationUtils.stripAndSanitize(this.$scope.editPropertyModel.property.description);
//if read only - or no changes made - just closes the modal
//need to check for property.value changes manually to detect if map properties deleted
diff --git a/catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view.html b/catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view.html
index dc26d1f6a3..6e6c29b4fc 100644
--- a/catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view.html
+++ b/catalog-ui/src/app/view-models/forms/property-forms/component-property-form/property-form-view.html
@@ -15,7 +15,7 @@
-->
<ng1-modal modal="modalInstanceProperty" type="classic" class="sdc-edit-property-container" buttons="footerButtons" header="{{isNew ? 'Add' : 'Update' }} Property" show-close-button="true" data-tests-id="sdc-edit-property-container">
<loader data-display="isLoading" relative="false" size="medium"></loader>
- <div class="sdc-modal-top-bar" data-ng-if="!isNew">
+ <div class="sdc-modal-top-bar" data-ng-if="!isNew && !editPropertyModel.property.propertyView">
<div class="sdc-modal-top-bar-buttons">
<span ng-click="delete(editPropertyModel.property)" data-ng-class="{'disabled' : isPropertyValueOwner || editPropertyModel.property.readonly || propertyOwnerType == 'group' || propertyOwnerType == 'policy'}" class="sprite-new delete-btn" data-tests-id="delete_property" sdc-smart-tooltip="">Delete</span>
<span class="delimiter"></span>
@@ -139,7 +139,7 @@
</div>
<!-- Default value -->
- <div class="default-value-section i-sdc-form-item">
+ <div class="default-value-section i-sdc-form-item" data-ng-if="!editPropertyModel.property.propertyView">
<label class="i-sdc-form-label">Default Value</label>
<ng-container ng-if="!componentMetadata.isVfc">
<input type="hidden" ng-model="editPropertyModel.isGetFunctionValid" required="required"/>
@@ -248,11 +248,11 @@
</div>
</div>
</div>
- <div class="constraints-section i-sdc-form-item" data-ng-if="editPropertyModel.property.constraints || !(isViewOnly || componentMetadata.isService)">
+ <div class="constraints-section i-sdc-form-item" data-ng-if="editPropertyModel.property.propertyView || editPropertyModel.property.constraints || !(isViewOnly || componentMetadata.isService)">
<label class="i-sdc-form-label">Constraints</label>
<ng-container>
<app-constraints [property-constraints]="editPropertyModel.property.constraints"
- [is-view-only]="isViewOnly || componentMetadata.isService"
+ [is-view-only]="editPropertyModel.property.propertyView? !editPropertyModel.property.propertyView :(isViewOnly || componentMetadata.isService)"
[property-type]="editPropertyModel.property.type"
(on-constraint-change)="onConstraintChange($event)">
</app-constraints>
diff --git a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentInputTab.java b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentInputTab.java
index a46e9a9bee..b83be254ef 100644
--- a/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentInputTab.java
+++ b/integration-tests/src/test/java/org/onap/sdc/frontend/ci/tests/pages/ResourcePropertiesAssignmentInputTab.java
@@ -157,7 +157,7 @@ public class ResourcePropertiesAssignmentInputTab extends AbstractPageObject {
PROPERTY_SAVE_MESSAGE("//div[contains(text(), 'Successfully saved')]"),
INPUT_PROPERTY_NAME("//*[contains(@class, 'property-name')]"),
INPUT_PROPERTY_TABLE_ROW("//div[contains(@class, 'table-row') and descendant::*[text() = '%s']]"),
- INPUT_PROPERTY_ADD_METADATA_BUTTON(INPUT_PROPERTY_TABLE_ROW.getXpath().concat("//a")),
+ INPUT_PROPERTY_ADD_METADATA_BUTTON(INPUT_PROPERTY_TABLE_ROW.getXpath().concat("//a[contains(@class, 'add-item')]")),
INPUT_PROPERTY_METADATA_KEY_VALUE_PAIR(INPUT_PROPERTY_TABLE_ROW.getXpath().concat("//input")),
INPUT_ADD_BTN("//div[contains(@class,'add-btn')]"),
MODAL_BACKGROUND("//div[@class='modal-background']");