bugfix for operations screen
[sdc.git] / catalog-ui / src / app / ng2 / pages / interface-operation / interface-operation.page.component.ts
index 70a0e95..4f93e72 100644 (file)
@@ -1,25 +1,36 @@
 import * as _ from "lodash";
-import {Component, Input, Output, ComponentRef, Inject} from '@angular/core';
-import {Component as IComponent} from 'app/models/components/component';
-
-import {SdcConfigToken, ISdcConfig} from "app/ng2/config/sdc-config.config";
-import {TranslateService} from "app/ng2/shared/translator/translate.service";
-
-import {Observable} from "rxjs/Observable";
-
-import {ModalComponent} from 'app/ng2/components/ui/modal/modal.component';
-import {ModalService} from 'app/ng2/services/modal.service';
-import {ModalModel, ButtonModel, InputBEModel, OperationModel, InterfaceModel, CreateOperationResponse, WORKFLOW_ASSOCIATION_OPTIONS} from 'app/models';
-
-import {IModalConfig, IModalButtonComponent} from "sdc-ui/lib/angular/modals/models/modal-config";
-import {SdcUiComponents} from "sdc-ui/lib/angular";
-import {ModalButtonComponent} from "sdc-ui/lib/angular/components";
-
-import {ComponentServiceNg2} from 'app/ng2/services/component-services/component.service';
-import {ComponentGenericResponse} from 'app/ng2/services/responses/component-generic-response';
-import {WorkflowServiceNg2} from 'app/ng2/services/workflow.service';
-
-import {OperationCreatorComponent, OperationCreatorInput} from './operation-creator/operation-creator.component';
+import { Component, Input, Inject } from '@angular/core';
+import {Component as IComponent } from 'app/models/components/component';
+
+import { SdcConfigToken, ISdcConfig } from "app/ng2/config/sdc-config.config";
+import {TranslateService } from "app/ng2/shared/translator/translate.service";
+
+import {Observable } from "rxjs/Observable";
+
+import { ModalComponent } from 'onap-ui-angular/dist/modals/modal.component';
+import {ModalService } from 'app/ng2/services/modal.service';
+import {
+    InputBEModel,
+    OperationModel,
+    InterfaceModel,
+    WORKFLOW_ASSOCIATION_OPTIONS,
+    CapabilitiesGroup,
+    Capability
+} from 'app/models';
+
+// import {SdcUiComponents } from 'sdc-ui/lib/angular';
+// import {ModalButtonComponent } from 'sdc-ui/lib/angular/components';
+// import { IModalButtonComponent, IModalConfig } from 'sdc-ui/lib/angular/modals/models/modal-config';
+
+import {ComponentServiceNg2 } from 'app/ng2/services/component-services/component.service';
+import {PluginsService } from 'app/ng2/services/plugins.service';
+import {WorkflowServiceNg2 } from 'app/ng2/services/workflow.service';
+
+import { OperationCreatorComponent, OperationCreatorInput } from 'app/ng2/pages/interface-operation/operation-creator/operation-creator.component';
+import { IModalButtonComponent } from 'onap-ui-angular';
+import { ModalButtonComponent } from 'onap-ui-angular';
+import { IModalConfig } from 'onap-ui-angular';
+import { SdcUiServices } from 'onap-ui-angular';
 
 export class UIOperationModel extends OperationModel {
     isCollapsed: boolean = true;
@@ -54,6 +65,7 @@ export class UIOperationModel extends OperationModel {
     }
 }
 
+// tslint:disable-next-line:max-classes-per-file
 class ModalTranslation {
     CREATE_TITLE: string;
     EDIT_TITLE: string;
@@ -67,7 +79,7 @@ class ModalTranslation {
     constructor(private TranslateService: TranslateService) {
         this.TranslateService.languageChangedObservable.subscribe(lang => {
             this.CREATE_TITLE = this.TranslateService.translate("INTERFACE_CREATE_TITLE");
-            this.EDIT_TITLE = this.TranslateService.translate("INTERFACE_EDIT_TITLE");
+            this.EDIT_TITLE = this.TranslateService.translate('INTERFACE_EDIT_TITLE');
             this.DELETE_TITLE = this.TranslateService.translate("INTERFACE_DELETE_TITLE");
             this.CANCEL_BUTTON = this.TranslateService.translate("INTERFACE_CANCEL_BUTTON");
             this.SAVE_BUTTON = this.TranslateService.translate("INTERFACE_SAVE_BUTTON");
@@ -78,6 +90,7 @@ class ModalTranslation {
     }
 }
 
+// tslint:disable-next-line:max-classes-per-file
 export class UIInterfaceModel extends InterfaceModel {
     isCollapsed: boolean = false;
 
@@ -85,7 +98,7 @@ export class UIInterfaceModel extends InterfaceModel {
         super(interf);
         this.operations = _.map(
             this.operations,
-            operation => new UIOperationModel(operation)
+            (operation) => new UIOperationModel(operation)
         );
     }
 
@@ -94,6 +107,7 @@ export class UIInterfaceModel extends InterfaceModel {
     }
 }
 
+// tslint:disable-next-line:max-classes-per-file
 @Component({
     selector: 'interface-operation',
     templateUrl: './interface-operation.page.component.html',
@@ -103,14 +117,17 @@ export class UIInterfaceModel extends InterfaceModel {
 
 export class InterfaceOperationComponent {
 
-    interfaces: Array<UIInterfaceModel>;
-    modalInstance: ComponentRef<ModalComponent>;
+    interfaces: UIInterfaceModel[];
+    modalInstance: ModalComponent;
     openOperation: OperationModel;
     enableWorkflowAssociation: boolean;
-    inputs: Array<InputBEModel>;
+    inputs: InputBEModel[];
     isLoading: boolean;
-    interfaceTypes:{ [interfaceType: string]: Array<string> };
+    interfaceTypes: { [interfaceType: string]: string[] };
     modalTranslation: ModalTranslation;
+    workflowIsOnline: boolean;
+    workflows: any[];
+    capabilities: CapabilitiesGroup;
 
     @Input() component: IComponent;
     @Input() readonly: boolean;
@@ -121,10 +138,12 @@ export class InterfaceOperationComponent {
         @Inject(SdcConfigToken) private sdcConfig: ISdcConfig,
         @Inject("$state") private $state: ng.ui.IStateService,
         private TranslateService: TranslateService,
+        private PluginsService: PluginsService,
         private ComponentServiceNg2: ComponentServiceNg2,
         private WorkflowServiceNg2: WorkflowServiceNg2,
         private ModalServiceNg2: ModalService,
-        private ModalServiceSdcUI: SdcUiComponents.ModalService
+        private ModalServiceSdcUI: SdcUiServices.ModalService
+        
     ) {
         this.enableWorkflowAssociation = sdcConfig.enableWorkflowAssociation;
         this.modalTranslation = new ModalTranslation(TranslateService);
@@ -132,54 +151,71 @@ export class InterfaceOperationComponent {
 
     ngOnInit(): void {
         this.isLoading = true;
+        this.workflowIsOnline = !_.isUndefined(this.PluginsService.getPluginByStateUrl('workflowDesigner'));
         Observable.forkJoin(
-            this.ComponentServiceNg2.getInterfaces(this.component),
+            this.ComponentServiceNg2.getInterfaceOperations(this.component),
             this.ComponentServiceNg2.getComponentInputs(this.component),
-            this.ComponentServiceNg2.getInterfaceTypes(this.component)
-        ).subscribe((response: Array<any>) => {
-            this.isLoading = false;
-            this.initInterfaces(response[0].interfaces);
-            this.sortInterfaces();
-            this.inputs = response[1].inputs;
-            this.interfaceTypes = response[2];
+            this.ComponentServiceNg2.getInterfaceTypes(this.component),
+            this.ComponentServiceNg2.getCapabilitiesAndRequirements(this.component.componentType, this.component.uniqueId)
+        ).subscribe((response: any[]) => {
+            const callback = (workflows) => {
+                this.isLoading = false;
+                this.initInterfaces(response[0].interfaces);
+                this.sortInterfaces();
+                this.inputs = response[1].inputs;
+                this.interfaceTypes = response[2];
+                this.workflows = (workflows.items) ? workflows.items: workflows;
+                this.capabilities = response[3].capabilities;
+            };
+            if (this.enableWorkflowAssociation && this.workflowIsOnline) {
+                this.WorkflowServiceNg2.getWorkflows().subscribe(
+                    callback,
+                    (err) => {
+                        this.workflowIsOnline = false;
+                        callback([]);
+                    }
+                );
+            } else {
+                callback([]);
+            }
         });
     }
 
-    initInterfaces(interfaces: Array<InterfaceModel>): void {
-        this.interfaces = _.map(interfaces, interf => new UIInterfaceModel(interf));
+    initInterfaces(interfaces: InterfaceModel[]): void {
+        this.interfaces = _.map(interfaces, (interf) => new UIInterfaceModel(interf));
     }
 
     sortInterfaces(): void {
-        this.interfaces = _.filter(this.interfaces, interf => interf.operations && interf.operations.length > 0); // remove empty interfaces
+        this.interfaces = _.filter(this.interfaces, (interf) => interf.operations && interf.operations.length > 0); // remove empty interfaces
         this.interfaces.sort((a, b) => a.type.localeCompare(b.type)); // sort interfaces alphabetically
-        _.forEach(this.interfaces, interf => {
+        _.forEach(this.interfaces, (interf) => {
             interf.operations.sort((a, b) => a.name.localeCompare(b.name)); // sort operations alphabetically
         });
     }
 
     collapseAll(value: boolean = true): void {
-        _.forEach(this.interfaces, interf => {
+        _.forEach(this.interfaces, (interf) => {
             interf.isCollapsed = value;
         });
     }
 
     isAllCollapsed(): boolean {
-        return _.every(this.interfaces, interf => interf.isCollapsed);
+        return _.every(this.interfaces, (interf) => interf.isCollapsed);
     }
 
     isAllExpanded(): boolean {
-        return _.every(this.interfaces, interf => !interf.isCollapsed);
+        return _.every(this.interfaces, (interf) => !interf.isCollapsed);
     }
 
     isListEmpty(): boolean {
         return _.filter(
             this.interfaces,
-            interf => interf.operations && interf.operations.length > 0
+            (interf) => interf.operations && interf.operations.length > 0
         ).length === 0;
     }
 
     getDisabled = (): boolean => {
-        return !this.modalInstance.instance.dynamicContent.instance.checkFormValidForSubmit();
+        return !this.modalInstance.innerModalContent.instance.checkFormValidForSubmit();
     }
 
     onEditOperation = (operation?: OperationModel): void => {
@@ -223,7 +259,7 @@ export class InterfaceOperationComponent {
             size: 'small',
             closeModal: true,
             callback: () => {
-                const modalInstance = this.ModalServiceSdcUI.getCurrentInstance().innerModalContent.instance;
+                const modalInstance = this.modalInstance.innerModalContent.instance;
 
                 const {operation, isUsingExistingWF, createParamLists} = modalInstance;
                 createParamLists();
@@ -239,14 +275,16 @@ export class InterfaceOperationComponent {
         };
 
         const input: OperationCreatorInput = {
+            allWorkflows: this.workflows,
             inputOperation: operation,
             interfaces: this.interfaces,
             inputProperties: this.inputs,
             enableWorkflowAssociation: this.enableWorkflowAssociation,
             readonly: this.readonly,
-            isService: this.component.isService(),
             interfaceTypes: this.interfaceTypes,
-            validityChangedCallback: this.enableOrDisableSaveButton
+            validityChangedCallback: this.enableOrDisableSaveButton,
+            workflowIsOnline: this.workflowIsOnline,
+            capabilities: _.filter(CapabilitiesGroup.getFlattenedCapabilities(this.capabilities), (capability: Capability) => capability.ownerId === this.component.uniqueId)
         };
 
         const modalConfig: IModalConfig = {
@@ -256,48 +294,66 @@ export class InterfaceOperationComponent {
             buttons: [saveButton, cancelButton] as IModalButtonComponent[]
         };
 
-        this.ModalServiceSdcUI.openCustomModal(modalConfig, OperationCreatorComponent, input);
-
-    }
-
-    private enableOrDisableSaveButton = (shouldEnable: boolean): void => {
-        let saveButton: ModalButtonComponent = this.ModalServiceSdcUI.getCurrentInstance().getButtonById('saveButton');
-        saveButton.disabled = !shouldEnable;
+        this.modalInstance = this.ModalServiceSdcUI.openCustomModal(modalConfig, OperationCreatorComponent, input);
     }
 
     onRemoveOperation = (event: Event, operation: OperationModel): void => {
         event.stopPropagation();
 
-        const confirmCallback = () => {
-            this.ComponentServiceNg2
-                .deleteInterfaceOperation(this.component, operation)
-                .subscribe(() => {
-                    const curInterf = _.find(this.interfaces, interf => interf.type === operation.interfaceType);
-                    const index = _.findIndex(curInterf.operations, el => el.uniqueId === operation.uniqueId);
-                    curInterf.operations.splice(index, 1);
-                    if (!curInterf.operations.length) {
-                        const interfIndex = _.findIndex(this.interfaces, interf => interf.type === operation.interfaceType);
-                        this.interfaces.splice(interfIndex, 1);
-                    }
-                });
-        }
+        const deleteButton: IModalButtonComponent = {
+            id: 'deleteButton',
+            text: this.modalTranslation.DELETE_BUTTON,
+            type: 'primary',
+            size: 'small',
+            closeModal: true,
+            callback: () => {
+                this.ComponentServiceNg2
+                    .deleteInterfaceOperation(this.component, operation)
+                    .subscribe(() => {
+                        const curInterf = _.find(this.interfaces, (interf) => interf.type === operation.interfaceType);
+                        const index = _.findIndex(curInterf.operations, (el) => el.uniqueId === operation.uniqueId);
+                        curInterf.operations.splice(index, 1);
+                        if (!curInterf.operations.length) {
+                            const interfIndex = _.findIndex(this.interfaces, (interf) => interf.type === operation.interfaceType);
+                            this.interfaces.splice(interfIndex, 1);
+                        }
+                    });
+            }
+        };
+
+        const cancelButton: IModalButtonComponent = {
+            id: 'cancelButton',
+            text: this.modalTranslation.CANCEL_BUTTON,
+            type: 'secondary',
+            size: 'small',
+            closeModal: true,
+            callback: () => {
+                this.openOperation = null;
+            },
+        };
 
-        this.ModalServiceSdcUI.openAlertModal(
+        this.ModalServiceSdcUI.openWarningModal(
             this.modalTranslation.DELETE_TITLE,
             this.modalTranslation.deleteText(operation.name),
-            this.modalTranslation.DELETE_BUTTON,
-            confirmCallback,
-            'deleteOperationModal'
+            'deleteOperationModal',
+            [deleteButton, cancelButton],
         );
     }
 
+    private enableOrDisableSaveButton = (shouldEnable: boolean): void => {
+        const saveButton = this.modalInstance.getButtonById('saveButton');
+        saveButton.disabled = !shouldEnable;
+    }
+
     private createOperation = (operation: OperationModel): void => {
-        this.ComponentServiceNg2.createInterfaceOperation(this.component, operation).subscribe((response: CreateOperationResponse) => {
+        this.ComponentServiceNg2.createInterfaceOperation(this.component, operation).subscribe((response: OperationModel) => {
             this.openOperation = null;
+
             let curInterf = _.find(
                 this.interfaces,
-                interf => interf.type === operation.interfaceType
-            )
+                (interf) => interf.type === operation.interfaceType
+            );
+
             if (!curInterf) {
                 curInterf = new UIInterfaceModel({
                     type: response.interfaceType,
@@ -306,10 +362,14 @@ export class InterfaceOperationComponent {
                 });
                 this.interfaces.push(curInterf);
             }
-            curInterf.operations.push(new UIOperationModel(response));
+
+            const newOpModel = new UIOperationModel(response);
+            curInterf.operations.push(newOpModel);
             this.sortInterfaces();
 
-            if (response.workflowId && operation.workflowAssociationType === WORKFLOW_ASSOCIATION_OPTIONS.EXISTING) {
+            if (operation.workflowAssociationType === WORKFLOW_ASSOCIATION_OPTIONS.EXTERNAL && operation.artifactData) {
+                this.ComponentServiceNg2.uploadInterfaceOperationArtifact(this.component, newOpModel, operation).subscribe();
+            } else if (response.workflowId && operation.workflowAssociationType === WORKFLOW_ASSOCIATION_OPTIONS.EXISTING) {
                 this.WorkflowServiceNg2.associateWorkflowArtifact(this.component, response).subscribe();
             } else if (operation.workflowAssociationType === WORKFLOW_ASSOCIATION_OPTIONS.NEW) {
                 this.$state.go('workspace.plugins', { path: 'workflowDesigner' });
@@ -318,23 +378,29 @@ export class InterfaceOperationComponent {
     }
 
     private updateOperation = (operation: OperationModel): void => {
-        this.ComponentServiceNg2.updateInterfaceOperation(this.component, operation).subscribe(newOperation => {
+        this.ComponentServiceNg2.updateInterfaceOperation(this.component, operation).subscribe((newOperation: OperationModel) => {
             this.openOperation = null;
 
-            _.forEach(this.interfaces, interf => {
-                _.forEach(interf.operations, op => {
+            let oldOpIndex;
+            let oldInterf;
+            _.forEach(this.interfaces, (interf) => {
+                _.forEach(interf.operations, (op) => {
                     if (op.uniqueId === newOperation.uniqueId) {
-                        const oldIndex = _.findIndex(interf.operations, el => el.uniqueId === op.uniqueId);
-                        interf.operations.splice(oldIndex, 1);
+                        oldInterf = interf;
+                        oldOpIndex = _.findIndex(interf.operations, (el) => el.uniqueId === op.uniqueId);
                     }
                 })
             });
+            oldInterf.operations.splice(oldOpIndex, 1);
 
-            const newInterf = _.find(this.interfaces, interf => interf.type === operation.interfaceType);
-            newInterf.operations.push(new UIOperationModel(newOperation));
+            const newInterf = _.find(this.interfaces, (interf) => interf.type === operation.interfaceType);
+            const newOpModel = new UIOperationModel(newOperation);
+            newInterf.operations.push(newOpModel);
             this.sortInterfaces();
 
-            if (newOperation.workflowId && operation.workflowAssociationType === WORKFLOW_ASSOCIATION_OPTIONS.EXISTING) {
+            if (operation.workflowAssociationType === WORKFLOW_ASSOCIATION_OPTIONS.EXTERNAL && operation.artifactData) {
+                this.ComponentServiceNg2.uploadInterfaceOperationArtifact(this.component, newOpModel, operation).subscribe();
+            } else if (newOperation.workflowId && operation.workflowAssociationType === WORKFLOW_ASSOCIATION_OPTIONS.EXISTING) {
                 this.WorkflowServiceNg2.associateWorkflowArtifact(this.component, newOperation).subscribe();
             }
         });