Merge "CDS Api reference add index, template, first APIs"
authorKAPIL SINGAL <ks220y@att.com>
Wed, 18 Nov 2020 16:28:50 +0000 (16:28 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 18 Nov 2020 16:28:50 +0000 (16:28 +0000)
cds-ui/designer-client/src/app/modules/feature-modules/packages/configuration-dashboard/configuration-dashboard.component.ts
cds-ui/designer-client/src/app/modules/feature-modules/packages/designer/action-attributes/action-attributes.component.html
cds-ui/designer-client/src/app/modules/feature-modules/packages/designer/action-attributes/action-attributes.component.ts
cds-ui/designer-client/src/app/modules/feature-modules/packages/designer/designer.component.html
cds-ui/designer-client/src/app/modules/feature-modules/packages/designer/designer.component.ts
cds-ui/designer-client/src/app/modules/feature-modules/packages/designer/designer.store.ts
cds-ui/designer-client/src/app/modules/feature-modules/packages/designer/functions-attribute/functions-attribute.component.html
cds-ui/designer-client/src/app/modules/feature-modules/packages/designer/functions-attribute/functions-attribute.component.ts
cds-ui/designer-client/src/app/modules/feature-modules/packages/designer/source-view/source-view.component.html
cds-ui/designer-client/src/app/modules/feature-modules/packages/designer/source-view/source-view.component.ts
docs/usecases/pnf-simulator.rst

index 766c50a..96e54d9 100644 (file)
@@ -264,6 +264,10 @@ export class ConfigurationDashboardComponent extends ComponentCanDeactivate impl
                     this.packageCreationExtractionService.extractBlobToStore(this.currentBlob);
                     this.isSaveEnabled = true;
                     this.toastService.info('enriched successfully ');
+                }, err => {
+                    this.handleError(err);
+                }, () => {
+                    this.ngxService.stop();
                 });
             }, error => {
                 this.toastService.error('error happened when enrich ' + error.message);
@@ -282,6 +286,10 @@ export class ConfigurationDashboardComponent extends ComponentCanDeactivate impl
                     const id = response.toString().split('id')[1].split(':')[1].split('"')[1];
                     this.isSaveEnabled = false;
                     this.router.navigate(['/packages/package/' + id]);
+                }, err => {
+                    this.handleError(err);
+                }, () => {
+                    this.ngxService.stop();
                 });
             }, error => {
                 this.handleError(error);
@@ -324,6 +332,8 @@ export class ConfigurationDashboardComponent extends ComponentCanDeactivate impl
         }
         this.toastService.error('error happened when deploying ' + errorMessage);
         console.log('Error -' + errorMessage);
+        this.ngxService.stop();
+        this.toastService.error('error happened when deploying' + error.message);
         return throwError(errorMessage);
     }
 }
index 5a0c9aa..013fa8a 100644 (file)
@@ -14,8 +14,8 @@
             <div class="row">
                 <div class="col pr-0 text-center">
                     <button type="button" data-toggle="modal" data-target="#exampleModalScrollable"
-                            class="btn btn-secondary"><i class="icon-custom-attribute" type="button"
-                                                         aria-hidden="true"></i></button>
+                            class="btn btn-secondary" (click)="clearFormInputs()"><i class="icon-custom-attribute" type="button"
+                                                         aria-hidden="true" ></i></button>
                     <span>Create Custom</span>
                 </div>
                 <div class="col text-center">
@@ -43,7 +43,7 @@
                     <div class="row">
                         <div class="col">
                             <div class="form-group" *ngFor="let input of inputs">
-                                <label for="exampleFormControlTextarea1">{{input.name}}
+                                <label >{{input.name}}
                                     <i [hidden]="!input.required" class="icon-required-star" type="button"
                                        aria-hidden="true"></i>
                                     <i [hidden]="input.required" class="icon-required-star optional-attribute"
@@ -52,7 +52,7 @@
                                 <div class="attributeOptions">
                                     <a data-toggle="modal" data-target="#exampleModalScrollable2"
                                        class="accordion-delete editAttribute" tooltip="Edit Attribute"
-                                       placement="bottom"><i class="icon-edit"></i></a>
+                                       placement="bottom" (click)="editAttribute(input)"><i class="icon-edit"></i></a>
                                     <a class="accordion-delete deleteAttribute" tooltip="Delete Attribute"
                                        placement="bottom"><i class="icon-delete-sm"></i></a>
                                 </div>
                     <div class="row">
                         <div class="col">
                             <div class="form-group" *ngFor="let output of outputs">
-                                <label for="exampleFormControlTextarea1">{{output.name}}
+                                <label >{{output.name}}
                                     <i [hidden]="!output.required" class="icon-required-star" type="button"
                                        aria-hidden="true"></i>
                                     <i [hidden]="output.required" class="icon-required-star optional-attribute"
                                        type="button" aria-hidden="true"></i>
 
                                 </label>
+                                <div class="attributeOptions">
+                                    <a data-toggle="modal" data-target="#exampleModalScrollable2"
+                                       class="accordion-delete editAttribute" tooltip="Edit Attribute"
+                                       placement="bottom" (click)="editAttribute(output)"><i class="icon-edit"></i></a>
+                                    <a class="accordion-delete deleteAttribute" tooltip="Delete Attribute"
+                                       placement="bottom"><i class="icon-delete-sm"></i></a>
+                                </div>
                             </div>
                         </div>
                     </div>
                                                                     )"></i></a>
                                         </div>
                                     </div>
-                                    <div class="carousel__snapper" [hidden]="!isNotComponentResourceResolution">
-                                        <a href="#carousel__slide4" [hidden]="isParametersHidden"
-                                           class="carousel__prev">Parameters</a>
-                                        <a href="#carousel__slide2" class="carousel__next">Attributes</a>
-                                    </div>
                                 </li>
                                 <!--Attribute-->
                                 <li id="carousel__slide2" tabindex="1" class="carousel__slide">
                                             <div class="scrollWrapper">
                                                 <div *ngIf="suggestedAttributes.length>0"
                                                      class="btn-group btn-group-toggle" data-toggle="buttons">
-                                                    <label class="btn btn-secondary active"
+                                                    <label class="btn btn-secondary"
                                                            *ngFor="let suggestedAttribute of suggestedAttributes"
                                                            [id]="suggestedAttribute"
                                                            (click)="addTempOutputAttr(suggestedAttribute)">
                                                         <input type="radio" name="options"
                                                                [id]="suggestedAttribute+'.,.'"
-                                                               autocomplete="off">
+                                                               autocomplete="off" [checked]="suggestedAttributes[0].includes(suggestedAttribute)">
                                                         {{suggestedAttribute}}
                                                     </label>
 
                                             </div>
                                         </div>
                                     </div>
-                                    <div class="carousel__snapper"></div>
-                                    <a href="#carousel__slide1" class="carousel__prev">Functions</a>
-                                    <a href="#carousel__slide3" [hidden]="!isNotComponentResourceResolution"
-                                       class="carousel__next">Artifacts</a>
-
                                 </li>
                                 <!--Artifact-->
                                 <li id="carousel__slide3" [hidden]="isNotComponentResourceResolution" tabindex="2"
                                             <div class="scrollWrapper">
                                                 <div *ngIf="currentArtifacts.length>0"
                                                      class="btn-group btn-group-toggle" data-toggle="buttons">
-                                                    <label class="btn btn-secondary active"
+                                                    <label class="btn btn-secondary"
                                                            *ngFor="let suggestedArtifact of currentArtifacts"
                                                            (click)="addArtifactFile(suggestedArtifact)">
                                                         <input type="radio" name="options" [id]="suggestedArtifact"
                                                                autocomplete="off"
-                                                               (click)="addTempOutputAttr(suggestedArtifact)">
+                                                               (click)="addArtifactFile(suggestedArtifact)"
+                                                               [checked]="currentArtifacts[0].includes(suggestedArtifact)"
+                                                        >
                                                         {{suggestedArtifact}}
                                                     </label>
 
                                             </div>
                                         </div>
                                     </div>
-                                    <div class="carousel__snapper" [hidden]="!isNotComponentResourceResolution">
-                                        <a href="#carousel__slide2" class="carousel__prev">Attributes</a>
-                                        <a href="#carousel__slide4" [hidden]="isParametersHidden"
-                                           class="carousel__next">Parmeters</a>
-                                    </div>
                                 </li>
                                 <!--Parameter-->
                                 <li id="carousel__slide4"
                                         <div class="tab-pane fade show active" id="list-home" role="tabpanel"
                                              aria-labelledby="list-home-list">
                                             <div class="scrollWrapper">
-                                                <div *ngIf="suggestedAttributes.length>0"
+                                                <div *ngIf="suggestedMappingParameters.length>0"
                                                      class="btn-group btn-group-toggle" data-toggle="buttons">
-                                                    <label class="btn btn-secondary active"
-                                                           *ngFor="let suggestedAttribute of suggestedAttributes"
-                                                           (click)="addTempOutputAttr(suggestedAttribute)">
-                                                        <input type="radio" name="options" [id]="suggestedAttribute"
+                                                    <label class="btn btn-secondary"
+                                                           *ngFor="let suggestedMappingParameter of suggestedMappingParameters"
+                                                           (click)="addSuggestedMappingParameter(suggestedMappingParameter)">
+                                                           <!--[class]="suggestedMappingParameters[0].includes(suggestedMappingParameter)?'btn btn-secondary active':'btn btn-secondary'">
+                                                       --> <input type="radio" name="options" [id]="suggestedMappingParameter"
                                                                autocomplete="off"
-                                                               (click)="addTempOutputAttr(suggestedAttribute)">
-                                                        {{suggestedAttribute}}
+                                                               (click)="addSuggestedMappingParameter(suggestedMappingParameter)"
+                                                               [checked]="suggestedMappingParameters[0].includes(suggestedMappingParameter)"
+
+                                                        >
+                                                        {{suggestedMappingParameter}}
                                                     </label>
 
                                                 </div>
-                                                <div *ngIf="suggestedAttributes.length == 0">
+                                                <div *ngIf="suggestedMappingParameters.length == 0">
                                                     <p class="noAttributes">No Attributes Available</p>
                                                 </div>
                                             </div>
                                         </div>
                                     </div>
-                                    <div class="carousel__snapper"></div>
-                                    <a href="#carousel__slide3" [hidden]="isNotComponentResourceResolution"
-                                       class="carousel__prev">Artifacts</a>
-                                    <a href="#carousel__slide1" class="carousel__next">Functions</a>
-
                                 </li>
                             </ol>
                             <aside class="carousel__navigation">
                 <ul class="nav nav-tabs" id="myTab" role="tablist">
                     <li class="nav-item">
                         <a class="nav-link active" id="home-tab" data-toggle="tab" href="#input" role="tab"
-                           aria-controls="home" aria-selected="true">Inputs</a>
+                           aria-controls="home" aria-selected="true" >Inputs</a>
                     </li>
                     <li class="nav-item">
                         <a class="nav-link" id="profile-tab" data-toggle="tab" href="#output" role="tab"
-                           aria-controls="profile" aria-selected="false">Outputs</a>
+                           aria-controls="profile" aria-selected="false" >Outputs</a>
                     </li>
                 </ul>
                 <div class="tab-content border-0 mt-2" id="myTabContent">
index babfec7..668aff9 100644 (file)
@@ -5,6 +5,8 @@ import {DesignerDashboardState} from '../model/designer.dashboard.state';
 import {Action} from './models/Action';
 import {FunctionsStore} from '../functions.store';
 import {FunctionsState} from '../model/functions.state';
+import {PackageCreationStore} from '../../package-creation/package-creation.store';
+import {CBAPackage} from '../../package-creation/mapping-models/CBAPacakge.model';
 
 @Component({
     selector: 'app-action-attributes',
@@ -44,8 +46,14 @@ export class ActionAttributesComponent implements OnInit {
     isNotComponentResourceResolution = true;
     currentArtifacts: string[] = [];
     isParametersHidden = true;
+    cbaPackage: CBAPackage;
+    suggestedMappingParameters: string[] = [];
+    selectedParameterList: string[] = [];
+    currentSuggestedArtifact: string;
 
-    constructor(private designerStore: DesignerStore, private functionsStore: FunctionsStore) {
+    constructor(private designerStore: DesignerStore,
+                private functionsStore: FunctionsStore,
+                private packageCreationStore: PackageCreationStore) {
 
     }
 
@@ -82,6 +90,12 @@ export class ActionAttributesComponent implements OnInit {
         this.functionsStore.state$.subscribe(functions => {
             this.functions = functions;
         });
+
+        this.packageCreationStore.state$
+            .subscribe(cbaPackage => {
+                this.cbaPackage = cbaPackage;
+
+            });
     }
 
 
@@ -139,23 +153,47 @@ export class ActionAttributesComponent implements OnInit {
     submitAttributes() {
         this.addInput(this.inputActionAttribute);
         if (this.selectedFunctionName && this.selectedAttributeName) {
+            console.log(this.getValue());
             this.outputActionAttribute.value =
-                '["' + this.selectedFunctionName + '","' + this.selectedAttributeName + '"]';
+                this.getValue();
         }
         this.addOutput(this.outputActionAttribute);
         this.clearFormInputs();
         this.storeOutputs(this.newOutputs);
         this.storeInputs((this.newInputs));
         this.newInputs.forEach(input => {
-            this.inputs.push(input);
+            if (!this.inputs.includes(input)) {
+                this.inputs.push(input);
+            }
         });
 
         this.newOutputs.forEach(output => {
-            this.outputs.push(output);
+            if (!this.outputs.includes(output)) {
+                this.outputs.push(output);
+            }
         });
     }
 
-    private clearFormInputs() {
+    private getValue() {
+        let value = '["' + this.selectedFunctionName + '", "' + '","' + this.selectedAttributeName;
+
+        if (!this.isParametersHidden) {
+            let currentSelected = '';
+            for (const selectedParameter of this.selectedParameterList) {
+                currentSelected += '"' + selectedParameter + '",';
+            }
+            value += '","' + this.currentSuggestedArtifact + '",'
+                + currentSelected.substr(0, currentSelected.length - 2) + '';
+        } else if (!this.isNotComponentResourceResolution && this.currentSuggestedArtifact) {
+            value += '","' + this.currentSuggestedArtifact + '';
+
+        }
+
+        return value += '"]';
+    }
+
+    public clearFormInputs() {
+        console.log('trying to clear ');
         this.inputActionAttribute = new InputActionAttribute();
         this.outputActionAttribute = new OutputActionAttribute();
         this.outputOtherType = '';
@@ -167,9 +205,11 @@ export class ActionAttributesComponent implements OnInit {
         let inputs = '';
         InputActionAttributes.forEach(input => {
             inputs += this.appendAttributes(input);
-
+            console.log(inputs);
         });
-        this.writeAttribute(inputs, 'inputs');
+        if (inputs.length > 0) {
+            this.writeAttribute(inputs, 'inputs');
+        }
     }
 
     private storeOutputs(OutputActionAttributes: OutputActionAttribute[]) {
@@ -177,7 +217,10 @@ export class ActionAttributesComponent implements OnInit {
         OutputActionAttributes.forEach(output => {
             outputs += this.appendOutputAttributes(output);
         });
-        this.writeAttribute(outputs, 'outputs');
+        if (outputs.length > 0) {
+            this.writeAttribute(outputs, 'outputs');
+        }
+
     }
 
     private appendAttributes(inputActionAttribute: InputActionAttribute) {
@@ -307,15 +350,28 @@ export class ActionAttributesComponent implements OnInit {
 
     private writeAttribute(newAttributes: string, attributeType: string) {
         newAttributes = this.removeTheLastComma(newAttributes);
-        const originalAttributes = this.convertToString(this.designerState.template.workflows[this.actionName]
+        console.log(newAttributes);
+        let originalAttributes = this.convertToString(this.designerState.template.workflows[this.actionName]
+            [attributeType]);
+        this.createAttributeTypeIfNotExisted(originalAttributes, attributeType);
+        originalAttributes = this.convertToString(this.designerState.template.workflows[this.actionName]
             [attributeType]);
-        console.log(originalAttributes.substr(0, originalAttributes.length - 1) + ',' + newAttributes + '}');
-        this.designerState.template.workflows[this.actionName][attributeType] =
-            this.convertToObject(originalAttributes.substr(0, originalAttributes.length - 1)
-                + ',' + newAttributes + '}');
+        if (originalAttributes.length > 2) {
+            this.designerState.template.workflows[this.actionName][attributeType] =
+                this.convertToObject(originalAttributes.substr(0, originalAttributes.length - 1)
+                    + ',' + newAttributes + '}');
+        } else {
+            this.designerState.template.workflows[this.actionName][attributeType] =
+                this.convertToObject(originalAttributes.substr(0, originalAttributes.length - 1)
+                    + newAttributes + '}');
+        }
+        /* console.log(originalAttributes.substr(0, originalAttributes.length - 1) + ',' + newAttributes + '}');
+         this.designerState.template.workflows[this.actionName][attributeType] =
+             this.convertToObject(originalAttributes.substr(0, originalAttributes.length - 1)
+                 + ',' + newAttributes + '}');*/
     }
 
-    private removeTheLastComma = (newInputs: string) => {
+    private removeTheLastComma(newInputs: string): string {
         if (newInputs.endsWith(',')) {
             newInputs = newInputs.substr(0, newInputs.length - 1);
         }
@@ -332,16 +388,15 @@ export class ActionAttributesComponent implements OnInit {
     getAttributesAndOutputs(functionName: string) {
         this.suggestedAttributes = [];
         console.log(functionName);
-        if (functionName.includes('component-resource-resolution')) {
+
+        const nodeTemplate = this.designerState.template.node_templates[functionName];
+        if (nodeTemplate['type'].includes('component-resource-resolution')) {
             this.isNotComponentResourceResolution = false;
             this.isParametersHidden = true;
         } else {
             this.isNotComponentResourceResolution = true;
             this.isParametersHidden = true;
         }
-        const nodeTemplate = this.designerState.template.node_templates[functionName];
-        console.log(this.designerState.template.node_templates);
-        console.log(nodeTemplate);
         /* tslint:disable:no-string-literal */
         console.log(nodeTemplate['type']);
         this.functions.serverFunctions
@@ -394,8 +449,40 @@ export class ActionAttributesComponent implements OnInit {
     }
 
     addArtifactFile(suggestedArtifact: string) {
-        console.log(suggestedArtifact);
+        this.currentSuggestedArtifact = suggestedArtifact;
         this.isParametersHidden = !this.selectedAttributeName.includes('assignment-map');
-        console.log('assignement map ' + this.isParametersHidden);
+        if (!this.isParametersHidden) {
+            this.suggestedMappingParameters = this.getSuggestedMappingParameters(suggestedArtifact);
+        }
+    }
+
+    private getSuggestedMappingParameters(suggestedArtifact: string) {
+        const suggestedMappingParameters = [];
+
+        this.cbaPackage.mapping.files.forEach(((value, key) => {
+            if (key.includes(suggestedArtifact)) {
+
+                JSON.parse(value).forEach(value2 => {
+                    suggestedMappingParameters.push(value2['name']);
+                });
+            }
+        }));
+        return suggestedMappingParameters;
+    }
+
+    addSuggestedMappingParameter(suggestedMappingParameter: string) {
+        this.addAttribute(this.selectedParameterList, suggestedMappingParameter);
+        this.deleteAttribute(this.suggestedMappingParameters, suggestedMappingParameter);
+
+    }
+
+    editAttribute(input: any) {
+        console.log(input);
+    }
+
+    private createAttributeTypeIfNotExisted(originalAttributes: string, attributeType: string) {
+        if (!originalAttributes) {
+            this.designerState.template.workflows[this.actionName][attributeType] = {};
+        }
     }
 }
index 3ca377d..b0bfe8b 100644 (file)
@@ -10,7 +10,7 @@
                     </li>
                     <i class="fa fa-angle-right ml-2 mr-2"></i>
                     <li class="breadcrumb-item">
-                        <a routerLink="/packages/package/{{viewedPackage.id}}">{{viewedPackage.artifactName}}</a>
+                        <a routerLink="/packages/package/{{packageId}}">{{viewedPackage.artifactName}}</a>
                         <button type="button" class="btn package-info-btn tooltip-bottom" data-toggle="modal"
                             data-target="#exampleModalLong" data-tooltip="Package Details">
                             <i class="icon-info" aria-hidden="true"></i>
             <li class="nav-item">
                 <div class="btn-group viewBtns" role="group">
                     <button type="button" class="btn btn-secondary topologySource active">Designer</button>
-                    <button [routerLink]="['/designer/source', viewedPackage.id]" type="button"
+                    <button [routerLink]="['/designer/source', packageId]" type="button"
                         class="btn btn-secondary topologyView">Scripting
                     </button>
                 </div>
                             </div>
                         </div>
                     </div>
-                    <app-functions-attribute></app-functions-attribute>
+                    <app-functions-attribute (saveEvent)="saveBluePrint()"></app-functions-attribute>
                 </div>
             </div>
         </div>
index 88f28b7..a2b57d6 100644 (file)
@@ -85,6 +85,7 @@ export class DesignerComponent implements OnInit, OnDestroy {
     steps: string[];
     designerState: DesignerDashboardState;
     currentActionName: string;
+    packageId: any;
 
     constructor(
         private designerStore: DesignerStore,
@@ -98,6 +99,7 @@ export class DesignerComponent implements OnInit, OnDestroy {
         private designerService: DesignerService,
         private packageCreationService: PackageCreationService,
         private packageCreationExtractionService: PackageCreationExtractionService,
+        private activatedRoute: ActivatedRoute,
         private toastService: ToastrService) {
         this.controllerSideBar = true;
         this.actionAttributesSideBar = false;
@@ -240,6 +242,13 @@ export class DesignerComponent implements OnInit, OnDestroy {
                     for (const workflowsKey in topologtTemplate.workflows) {
                         if (workflowsKey && !this.actions.includes(workflowsKey)) {
                             this.actions.push(workflowsKey);
+                            /* tslint:disable:no-string-literal */
+                            if (!this.designerState.template.workflows[workflowsKey]['inputs']) {
+                                this.designerState.template.workflows[workflowsKey]['inputs'] = {};
+                            }
+                            if (!this.designerState.template.workflows[workflowsKey]['outputs']) {
+                                this.designerState.template.workflows[workflowsKey]['outputs'] = {};
+                            }
                         }
                     }
                 }
@@ -247,6 +256,9 @@ export class DesignerComponent implements OnInit, OnDestroy {
 
         // action triggering
         this.functionStore.retrieveFuntions();
+        this.activatedRoute.paramMap.subscribe(res => {
+            this.packageId = res.get('id');
+        });
 
     }
 
index 857654c..c9151c5 100644 (file)
@@ -78,7 +78,7 @@ export class DesignerStore extends Store<DesignerDashboardState> {
     }
 
     saveSourceContent(code: string) {
-        console.log(code);
+      //  console.log(code);
         if (code) {
             const topologyTemplate = JSON.parse(code);
             this.setState({
index ab5bb12..505844c 100644 (file)
             </div>
         </div>
     </div>
-    <button class="btn btn-info" (click)="saveFunctionData()">Save</button>
+    <button class="btn btn-info  btn-select-template m-auto" (click)="saveFunctionData()">Save</button>
 </div>
 
 <!--function - Select Template - Modal-->
index 347f304..3890a98 100644 (file)
@@ -1,4 +1,4 @@
-import { Component, OnDestroy, OnInit } from '@angular/core';
+import { Component, EventEmitter, OnDestroy, OnInit, Output } from '@angular/core';
 import { DesignerStore } from '../designer.store';
 import { PackageCreationStore } from '../../package-creation/package-creation.store';
 import { Subject } from 'rxjs';
@@ -34,6 +34,7 @@ export class FunctionsAttributeComponent implements OnInit, OnDestroy {
     actionName = '';
     functionName = '';
     interfaceChildName = '';
+    @Output() saveEvent = new EventEmitter<string>();
 
 
     constructor(
@@ -132,7 +133,11 @@ export class FunctionsAttributeComponent implements OnInit, OnDestroy {
             if (inputs) {
                 for (const [key, value] of Object.entries(inputs)) {
                     console.log(key + ' - ' + value);
-                    this.currentFuncion.inputs[key] = value;
+                    if (typeof value === 'object') {
+                        this.currentFuncion.inputs[key] = JSON.stringify(value);
+                    } else {
+                        this.currentFuncion.inputs[key] = value;
+                    }
                 }
             }
             if (outputs) {
@@ -182,7 +187,7 @@ export class FunctionsAttributeComponent implements OnInit, OnDestroy {
 
             if (value.isTemplate) {
                 this.nodeTemplates.artifacts[key + '-template'] = {
-                    type: 'artifact-template-resource',
+                    type: 'artifact-template-velocity',
                     file: 'Templates/' + key + '-template.vtl'
                 };
             }
@@ -210,6 +215,7 @@ export class FunctionsAttributeComponent implements OnInit, OnDestroy {
         console.log(node_templates);
         // tslint:disable-next-line: no-unused-expression
         this.designerStore.addNodeTemplate(instanceName, type, node_templates[instanceName]);
+        this.saveEvent.emit('save');
     }
     // Template logic
     private setIsMappingOrTemplate(key: string, templateAndMapping: TemplateAndMapping, isFromTemplate: boolean) {
@@ -262,6 +268,7 @@ export class FunctionsAttributeComponent implements OnInit, OnDestroy {
     getObjectValue(object) {
         return Object.values(object);
     }
+
     getNodeType(nodeName: string) {
         this.functionStore.state$
             .subscribe(state => {
index eedbe9f..322acb9 100644 (file)
@@ -9,7 +9,7 @@
                     </li>
                     <i class="fa fa-angle-right ml-2 mr-2"></i>
                     <li class="breadcrumb-item">
-                        <a href="/package/{{viewedPackage.id}}">{{viewedPackage.artifactName}}</a>
+                        <a href="/package/{{this.packageId}}">{{viewedPackage.artifactName}}</a>
                         <button type="button" class="btn package-info-btn" data-toggle="modal"
                             data-target="#exampleModalLong">
                             <i class="icon-info" aria-hidden="true"></i>
             [theme]="'tomorrow_night_bright'" #editor style="height:500px">
         </ace-editor>
 
-    </div>
-    
\ No newline at end of file
+    </div>
\ No newline at end of file
index 2c576f2..ae4d09d 100644 (file)
@@ -22,6 +22,7 @@ export class DesignerSourceViewComponent implements OnInit, OnDestroy {
     viewedPackage: BluePrintDetailModel = new BluePrintDetailModel();
     public customActionName = '';
     cl = 'editBar';
+    packageId: string;
 
     constructor(
         private store: DesignerStore,
@@ -31,15 +32,15 @@ export class DesignerSourceViewComponent implements OnInit, OnDestroy {
         private sourceViewService: SourceViewService) {
         this.controllerSideBar = true;
     }
-     _toggleSidebar1() {
+    _toggleSidebar1() {
         this.controllerSideBar = !this.controllerSideBar;
         if (this.controllerSideBar === false) {
-          this.cl = 'editBar2';
-       }
+            this.cl = 'editBar2';
+        }
         if (this.controllerSideBar === true) {
-        this.cl = 'editBar';
-       }
-      }
+            this.cl = 'editBar';
+        }
+    }
 
     ngOnInit() {
         this.store.state$.subscribe(
@@ -55,13 +56,17 @@ export class DesignerSourceViewComponent implements OnInit, OnDestroy {
                     this.viewedPackage = bluePrintDetailModels[0];
                 }
             });
+
+        this.route.paramMap.subscribe(res => {
+            this.packageId = res.get('id');
+        });
     }
 
     convertAndOpenInDesingerView(id) {
         // TODO validate json against scheme
         console.log('convertAndOpenInDesingerView ...', this.content);
         this.store.saveSourceContent(this.content);
-        this.router.navigate(['/packages/designer', id, { actionName: this.customActionName }]);
+        this.router.navigate(['/packages/designer', this.packageId, { actionName: this.customActionName }]);
     }
 
     ngOnDestroy() {
index 3712253..2f6c847 100644 (file)
@@ -42,12 +42,6 @@ here but they are not tested by the author of this guide.
 
    .. tab:: sysrepo/sysrepo-netopeer2 (latest)
 
-      .. warning::
-         Currently there is an issue for the SSH connection between CDS and the netconf server because of unmatching
-         exchange key algorhithms
-         (see `Stackoverflow <https://stackoverflow.com/questions/64047502/java-lang-illegalstateexception-unable-to-negotiate-key-exchange-for-server-hos>`_).
-         **Use legacy version (right tab) until the issue is resolved.**
-
       Download and run docker container with ``docker run -d --name netopeer2 -p 830:830 -p 6513:6513 sysrepo/sysrepo-netopeer2:latest``
 
       Enter the container with ``docker exec -it netopeer2 bin/bash``