From 4aff8f5eafb6fbd6cc2c764fa1a5a676fa05c89c Mon Sep 17 00:00:00 2001 From: vasraz Date: Thu, 24 Mar 2022 18:31:14 +0000 Subject: Implement adding Interface to VFC Change-Id: I7cd8b82c306294d897d37d486aa3eeff7ca4206d Signed-off-by: Vasyl Razinkov Issue-ID: SDC-3893 Signed-off-by: andre.schmid --- .../param-row/param-row.component.html | 100 ++++++++ .../param-row/param-row.component.less | 73 ++++++ .../param-row/param-row.component.ts | 257 +++++++++++++++++++++ 3 files changed, 430 insertions(+) create mode 100644 catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.html create mode 100644 catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.less create mode 100644 catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.ts (limited to 'catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row') diff --git a/catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.html b/catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.html new file mode 100644 index 0000000000..1ed0375a16 --- /dev/null +++ b/catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.html @@ -0,0 +1,100 @@ + + +
+ + + {{param.name}} +
+ +
+ + + {{param.type}} +
+ +
+ + + {{ 'PARAM_NONE_OF_TYPE' | translate }} + +
+ +
+ + +
+ +
+ + +
diff --git a/catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.less b/catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.less new file mode 100644 index 0000000000..d616bad1f9 --- /dev/null +++ b/catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.less @@ -0,0 +1,73 @@ +/* +* ============LICENSE_START======================================================= +* SDC +* ================================================================================ +* Copyright (C) 2022 Nordix Foundation. All rights reserved. +* ================================================================================ +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* SPDX-License-Identifier: Apache-2.0 +* ============LICENSE_END========================================================= +*/ +@import '../../../../../../assets/styles/variables.less'; + +.remove { + display: flex; + align-items: center; + justify-content: center; + + svg-icon { + position: relative; + right: -3px; + + &:hover { + cursor: pointer; + } + } +} + + +.cell { + min-height: 50px; + padding: 10px; + display: flex; + align-items: center; + + > * { + flex-basis: 100%; + } + + /deep/ select { + height: 30px; + } + + input { + height: 30px; + border: none; + padding-left: 10px; + } + + select { + width: 100%; + } + + &.field-property { + &:last-child { + flex: 1; + } + + .no-properties-error { + color: @func_color_q; + font-style: italic; + } + } +} diff --git a/catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.ts b/catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.ts new file mode 100644 index 0000000000..43760ba117 --- /dev/null +++ b/catalog-ui/src/app/ng2/pages/interface-definition/operation-creator/param-row/param-row.component.ts @@ -0,0 +1,257 @@ +/* +* ============LICENSE_START======================================================= +* SDC +* ================================================================================ +* Copyright (C) 2022 Nordix Foundation. All rights reserved. +* ================================================================================ +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* SPDX-License-Identifier: Apache-2.0 +* ============LICENSE_END========================================================= +*/ +import {Component, Input} from '@angular/core'; +import {DataTypeService} from "app/ng2/services/data-type.service"; +import { + Capability, + DataTypeModel, + InputBEModel, + OperationModel, + OperationParameter +} from 'app/models'; +import { + DropdownValue +} from "app/ng2/components/ui/form-components/dropdown/ui-element-dropdown.component"; +import {WorkspaceService} from "../../../workspace/workspace.service"; + +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', + styleUrls: ['./param-row.component.less'] +}) + +export class ParamRowComponent { + @Input() param: OperationParameter; + @Input() inputProps: Array; + @Input() operationOutputs: Array; + @Input() capabilitiesProps: Array; + @Input() onRemoveParam: Function; + @Input() isAssociateWorkflow: boolean; + @Input() readonly: boolean; + @Input() isInputParam: boolean; + @Input() validityChanged: Function; + + propTypeEnum: Array = []; + operationOutputCats: Array<{ operationName: string, outputs: Array }> = []; + filteredInputProps: Array = []; + filteredCapabilitiesProps: Array<{ capabilityName: string, properties: Array }> = []; + + constructor(private dataTypeService: DataTypeService, protected workspaceService: WorkspaceService) { + } + + ngOnInit() { + if (this.isInputParam) { + this.propTypeEnum = _.uniq( + _.map( + _.concat( + this.getPrimitiveSubtypes(), + _.reduce( + this.operationOutputs, + (acc, op) => [...acc, ...op.outputs.listToscaDataDefinition], + []), + _.reduce( + this.capabilitiesProps, + (acc, capab) => [...acc, ...capab.properties], + []) + ), + prop => prop.type + ) + ); + } else { + const dataTypes: Array = _.toArray(this.dataTypeService.getDataTypeByModel(this.workspaceService.metadata.model)); + this.propTypeEnum = _.concat( + _.map( + _.filter( + dataTypes, + type => this.isTypePrimitive(type.name) + ), + type => type.name + ).sort(), + _.map( + _.filter( + dataTypes, + type => !this.isTypePrimitive(type.name) + ), + type => type.name + ).sort() + ); + } + + this.onChangeType(); + this.validityChanged(); + } + + onChangeName() { + this.validityChanged(); + } + + onChangeType() { + if (!this.isInputParam) { + this.validityChanged(); + return; + } + + this.filteredInputProps = _.map( + _.filter( + this.getPrimitiveSubtypes(), + prop => !this.param.type || prop.type === this.param.type + ), + prop => new DropdownValue(prop.uniqueId, prop.name) + ); + this.filteredInputProps.unshift(new DropdownValue("", "")); + + 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 + ); + + this.filteredCapabilitiesProps = _.filter( + _.map( + this.capabilitiesProps, + cap => { + return { + capabilityName: cap.name, + properties: _.map( + _.filter(cap.properties, prop => !this.param.type || prop.type === this.param.type), + prop => new DropdownValueType( + prop.uniqueId, + prop.name, + prop.type + ) + ) + }; + } + ), + capability => capability.properties.length > 0 + ); + + if (this.param.inputId) { + const selProp = this.getSelectedProp(); + if (selProp && selProp.type === this.param.type) { + this.param.inputId = '-1'; + setTimeout(() => this.param.inputId = selProp.uniqueId || selProp.value); + } else { + this.param.inputId = null; + } + } + + this.validityChanged(); + } + + onChangeProperty() { + const newProp = this.getSelectedProp(); + + if (!this.param.type) { + this.param.type = newProp.type; + this.onChangeType(); + } + + if (!this.param.name) { + this.param.name = newProp.name || newProp.label; + } + + this.validityChanged(); + } + + getPrimitiveSubtypes(): Array { + const flattenedProps: Array = []; + const dataTypes = this.dataTypeService.getDataTypeByModel(this.workspaceService.metadata.model); + + _.forEach(this.inputProps, prop => { + const type: DataTypeModel = _.find( + _.toArray(dataTypes), + (type: DataTypeModel) => type.name === prop.type + ); + flattenedProps.push(prop); + if (!type) { + console.error('Could not find prop in dataTypes: ', prop); + } else { + if (type.properties) { + _.forEach(type.properties, subType => { + if (this.isTypePrimitive(subType.type)) { + flattenedProps.push({ + type: subType.type, + name: `${prop.name}.${subType.name}`, + uniqueId: `${prop.uniqueId}.${subType.name}` + }); + } + }); + } + } + }); + + 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 + ) || _.find( + _.reduce( + this.filteredCapabilitiesProps, + (acc, cap) => [...acc, ...cap.properties], + []), + (prop: DropdownValueType) => this.param.inputId === prop.value + ); + } + + isTypePrimitive(type: string): boolean { + return ( + type === 'string' || + type === 'integer' || + type === 'float' || + type === 'boolean' + ); + } +} -- cgit 1.2.3-korg