2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2023 Nordix Foundation
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 * SPDX-License-Identifier: Apache-2.0
17 * ============LICENSE_END=========================================================
20 import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
23 IActivityParameterList,
24 InputOperationParameter,
27 } from "../../../../../../models/interfaceOperation";
28 import { DataTypeModel } from "../../../../../../models/data-types";
29 import { Observable } from "rxjs/Observable";
30 import { InstanceFeDetails } from "../../../../../../models/instance-fe-details";
39 } from '@angular/forms';
42 selector: 'activities-list',
43 templateUrl: './activities-list.component.html',
44 styleUrls: ['./activities-list.component.less']
46 export class ActivitiesListComponent implements OnInit {
48 @Input() componentInstanceMap: Map<string, InstanceFeDetails> = new Map();
49 @Input() dataTypeMap: Map<string, DataTypeModel>;;
50 @Input() dataTypeMap$: Observable<Map<string, DataTypeModel>>;
51 @Input() existingActivities: IActivityParameterList;
52 @Input() isViewOnly: boolean;
53 @Output('activitiesChangeEvent') activitiesChangeEvent: EventEmitter<any> = new EventEmitter<any>();
55 readonly DEFAULT_INPUT_TYPE: string = "tosca.dataTypes.tmf.milestoneJeopardyData";
56 readonly DEFAULT_INPUT_NAME: string = "TMFMilestoneJeopardyData";
57 activityTypes: string[] = [];
58 activities: ActivityParameter[] = [];
59 activityFormArray: FormArray = new FormArray([]);
60 activityForm: FormGroup = new FormGroup (
62 'activityFormList': this.activityFormArray
65 validationMessages = {
67 { type: 'required', message: 'Activity type and value is required'}
72 Object.keys(ActivityTypesEnum).forEach(key => {
73 this.activityTypes.push(ActivityTypesEnum[key])
75 this.activityForm.valueChanges.subscribe(() => {
76 this.emitOnActivityChange();
78 if (this.existingActivities && this.existingActivities.listToscaDataDefinition && this.existingActivities.listToscaDataDefinition.length > 0) {
79 this.existingActivities.listToscaDataDefinition.forEach(val => {
80 this.activities.push(val);
81 this.activityFormArray.push(
82 new FormControl(val, [Validators.required, this.formControlValidator()])
88 private emitOnActivityChange(): void {
89 this.activitiesChangeEvent.emit({
90 activities: this.activities,
91 valid: this.activityForm.valid
96 let input = new class implements IOperationParamsList {
97 listToscaDataDefinition: Array<InputOperationParameter> = [];
99 let activityParameter: ActivityParameter = {
104 this.activities.push(activityParameter);
105 this.activityFormArray.push(
106 new FormControl(activityParameter, [Validators.required, this.formControlValidator()])
109 let index = this.activities.indexOf(activityParameter);
110 let inputOperationParameter: InputOperationParameter = new InputOperationParameter();
111 inputOperationParameter.name = this.DEFAULT_INPUT_NAME;
112 inputOperationParameter.type = this.DEFAULT_INPUT_TYPE;
113 inputOperationParameter.valid = true;
114 this.activities[index].inputs.listToscaDataDefinition.push(inputOperationParameter);
115 this.activities[index].inputs.listToscaDataDefinition = Array.from(this.activities[index].inputs.listToscaDataDefinition);
118 private formControlValidator(): ValidatorFn {
119 return (control: AbstractControl): ValidationErrors | null => {
120 const activity = control.value;
121 if (!activity || !activity.type || !activity.workflow) {
122 return {required:true};
128 removeFromActivities (index: number) {
129 this.activities.splice(index, 1);
130 this.activityFormArray.removeAt(index);
133 onActivityTypeChange(type: string, index: number) {
134 let activity = this.activityFormArray.controls[index].value;
135 activity.type = type;
136 this.activityFormArray.controls[index].setValue(activity);
139 onActivityValueChange (value: any, index: number) {
140 let activity = this.activityFormArray.controls[index].value;
141 activity.workflow = value;
142 this.activityFormArray.controls[index].setValue(activity);
145 collectInputNames(index: number) {
146 if (this.activities[index].inputs) {
147 return this.activities[index].inputs.listToscaDataDefinition.map((input) => input.name);
152 onAddInput(inputOperationParameter: InputOperationParameter, index: number) {
153 if (!this.activities[index].inputs) {
154 let input = new class implements IOperationParamsList {
155 listToscaDataDefinition: Array<InputOperationParameter> = [];
157 this.activities[index].inputs = input;
159 this.activities[index].inputs.listToscaDataDefinition.push(inputOperationParameter);
160 this.activities[index].inputs.listToscaDataDefinition = Array.from(this.activities[index].inputs.listToscaDataDefinition);
161 this.emitOnActivityChange();
164 getInputs(index: number) {
165 if (this.activities[index].inputs && this.activities[index].inputs.listToscaDataDefinition) {
166 let test: InputOperationParameter[] = this.activities[index].inputs.listToscaDataDefinition;
172 onInputValueChange(changedInput: InputOperationParameter, index: number) {
173 if (changedInput.value instanceof Object) {
174 changedInput.value = JSON.stringify(changedInput.value);
176 const inputOperationParameter = this.activities[index].inputs.listToscaDataDefinition.find(value => value.name == changedInput.name);
177 inputOperationParameter.toscaFunction = null;
178 inputOperationParameter.value = changedInput.value;
179 inputOperationParameter.subPropertyToscaFunctions = changedInput.subPropertyToscaFunctions;
180 if (changedInput.isToscaFunction()) {
181 inputOperationParameter.toscaFunction = changedInput.toscaFunction;
182 inputOperationParameter.value = changedInput.toscaFunction.buildValueString();
186 onInputDelete(inputName: string, index: number) {
187 const currentInputs = this.activities[index].inputs.listToscaDataDefinition;
188 const input1 = currentInputs.find(value => value.name === inputName);
189 const indexOfInput = currentInputs.indexOf(input1);
190 if (indexOfInput === -1) {
191 console.error(`Could not delete input '${inputName}'. Input not found.`);
194 currentInputs.splice(currentInputs.indexOf(input1), 1);
195 this.activities[index].inputs.listToscaDataDefinition = Array.from(currentInputs);