Map operation outputs to input properties
Change-Id: Iedf41e429c87ac9e15c8ff520e3ce7d69e44293d
Issue-ID: SDC-2084
Signed-off-by: Arielk <Ariel.Kenan@amdocs.com>
diff --git a/catalog-ui/src/app/models/operation.ts b/catalog-ui/src/app/models/operation.ts
index 6eeccec..d36b72a 100644
--- a/catalog-ui/src/app/models/operation.ts
+++ b/catalog-ui/src/app/models/operation.ts
@@ -81,9 +81,9 @@
}
}
- public displayName(): string {
- const lastDot = this.name ? this.name.lastIndexOf('.') : -1;
- return lastDot === -1 ? this.name : this.name.substr(lastDot + 1);
+ public displayType(): string {
+ const lastDot = this.interfaceType ? this.interfaceType.lastIndexOf('.') : -1;
+ return lastDot === -1 ? this.interfaceType : this.interfaceType.substr(lastDot + 1);
}
}
diff --git a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/operation-creator.component.html b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/operation-creator.component.html
index 4acf424..5848b58 100644
--- a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/operation-creator.component.html
+++ b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/operation-creator.component.html
@@ -157,6 +157,7 @@
[isAssociateWorkflow]="isUsingExistingWF()"
[param]="param"
[inputProps]="inputProperties"
+ [operationOutputs]="operationOutputs"
[onRemoveParam]="onRemoveParam"
[readonly]="readonly"
[validityChanged]="validityChanged">
diff --git a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/operation-creator.component.ts b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/operation-creator.component.ts
index e746c6d..fd9e1cf 100644
--- a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/operation-creator.component.ts
+++ b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/operation-creator.component.ts
@@ -73,6 +73,7 @@
assignOutputParameters: { [key: string]: { [key: string]: Array<OperationParameter>; }; } = {};
tableParameters: Array<OperationParameter> = [];
+ operationOutputs: Array<OperationModel> = [];
associationOptions: Array<DropdownValue> = [];
workflowAssociationType: string;
@@ -134,6 +135,17 @@
this.onSelectInterface(new DropDownOption(this.operation.interfaceType));
this.validityChanged();
+ this.operationOutputs = _.reduce(
+ this.interfaces,
+ (acc: Array<OperationModel>, interf) => [
+ ...acc,
+ ..._.filter(
+ interf.operations,
+ op => op.uniqueId !== this.operation.uniqueId
+ ),
+ ],
+ []);
+
if (this.enableWorkflowAssociation) {
this.isLoading = true;
this.workflowServiceNg2.getWorkflows().subscribe(workflows => {
diff --git a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.html b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.html
index d237837..aa4277c 100644
--- a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.html
+++ b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.html
@@ -38,14 +38,27 @@
</div>
<div class="cell field-property" *ngIf="isInputParam">
- <ui-element-dropdown
+ <select
*ngIf="filteredInputProps.length || !isAssociateWorkflow"
- [testId]="'param-property-' + (param.name || 'unnamed')"
- [values]="filteredInputProps"
- [(value)]="param.inputId"
- (valueChange)="onChangeProperty($event)"
- [readonly]="readonly">
- </ui-element-dropdown>
+ [(ngModel)]="param.inputId"
+ (change)="onChangeProperty($event)"
+ [ngClass]="{'disabled': readonly}"
+ [attr.data-tests-id]="'value-param-property-' + (param.name || 'unnamed')">
+ <option
+ *ngFor="let prop of filteredInputProps"
+ [ngValue]="prop.value">
+ {{prop.label}}
+ </option>
+ <optgroup
+ *ngFor="let operation of operationOutputCats"
+ label="{{operation.operationName}}">
+ <option
+ *ngFor="let output of operation.outputs"
+ [ngValue]="output.value">
+ {{output.label}}
+ </option>
+ </optgroup>
+ </select>
<span
*ngIf="!filteredInputProps.length && isAssociateWorkflow"
class="no-properties-error">
diff --git a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.less b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.less
index 99a54bb..f6cda17 100644
--- a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.less
+++ b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.less
@@ -35,6 +35,10 @@
padding-left: 10px;
}
+ select {
+ width: 100%;
+ }
+
&.field-property {
&:last-child {
flex: 1;
diff --git a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.ts b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.ts
index 89aa251..bfa2b11 100644
--- a/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.ts
+++ b/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.ts
@@ -1,9 +1,20 @@
import {Component, Input} from '@angular/core';
import {DataTypeService} from "app/ng2/services/data-type.service";
-import {OperationParameter, InputBEModel} from 'app/models';
+import {OperationModel, OperationParameter, InputBEModel} from 'app/models';
import {DropDownOption} from "../operation-creator.component";
import {DropdownValue} from "app/ng2/components/ui/form-components/dropdown/ui-element-dropdown.component";
+class DropdownValueType extends DropdownValue {
+ type: String;
+
+ constructor(value: string, label: string, type?: String) {
+ super(value, label);
+ if (type) {
+ this.type = type;
+ }
+ }
+}
+
@Component({
selector: 'param-row',
templateUrl: './param-row.component.html',
@@ -13,6 +24,7 @@
export class ParamRowComponent {
@Input() param: OperationParameter;
@Input() inputProps: Array<InputBEModel>;
+ @Input() operationOutputs: Array<OperationModel>;
@Input() onRemoveParam: Function;
@Input() isAssociateWorkflow: boolean;
@Input() readonly: boolean;
@@ -20,6 +32,7 @@
@Input() validityChanged: Function;
propTypeEnum: Array<string> = [];
+ operationOutputCats: Array<{ operationName: string, outputs: Array<DropdownValueType> }> = [];
filteredInputProps: Array<DropdownValue> = [];
constructor(private dataTypeService: DataTypeService) {}
@@ -31,6 +44,7 @@
prop => prop.type
)
);
+
this.onChangeType();
this.validityChanged();
}
@@ -48,14 +62,31 @@
prop => new DropdownValue(prop.uniqueId, prop.name)
);
+ this.operationOutputCats = _.filter(
+ _.map(
+ this.operationOutputs,
+ op => {
+ return {
+ operationName: `${op.displayType()}.${op.name}`,
+ outputs: _.map(
+ _.filter(op.outputs.listToscaDataDefinition, output => !this.param.type || output.type === this.param.type),
+ output => new DropdownValueType(
+ `${op.interfaceType}.${op.name}.${output.name}`,
+ output.name,
+ output.type
+ )
+ )
+ };
+ }
+ ),
+ category => category.outputs.length > 0
+ );
+
if (this.param.inputId) {
- const selProp = _.find(
- this.getPrimitiveSubtypes(),
- prop => prop.uniqueId === this.param.inputId
- );
+ const selProp = this.getSelectedProp();
if (selProp && selProp.type === this.param.type) {
this.param.inputId = '-1';
- setTimeout(() => this.param.inputId = selProp.uniqueId, 100);
+ setTimeout(() => this.param.inputId = selProp.uniqueId || selProp.value, 0);
} else {
this.param.inputId = null;
}
@@ -65,10 +96,7 @@
}
onChangeProperty() {
- const newProp = _.find(
- this.getPrimitiveSubtypes(),
- prop => this.param.inputId === prop.uniqueId
- );
+ const newProp = this.getSelectedProp();
if (!this.param.type) {
this.param.type = newProp.type;
@@ -76,7 +104,7 @@
}
if (!this.param.name) {
- this.param.name = newProp.name;
+ this.param.name = newProp.name || newProp.label;
}
this.validityChanged();
@@ -108,6 +136,19 @@
return flattenedProps;
}
+ getSelectedProp() {
+ return _.find(
+ this.getPrimitiveSubtypes(),
+ prop => this.param.inputId === prop.uniqueId
+ ) || _.find(
+ _.reduce(
+ this.operationOutputCats,
+ (acc, cat) => [...acc, ...cat.outputs],
+ []),
+ (out: DropdownValueType) => this.param.inputId === out.value
+ );
+ }
+
isTypePrimitive(type): boolean {
return (
type === 'string' ||