Add package deletion button 32/109632/1
authorAhmedEldeeb50 <ahmed.eldeeb.ext@orange.com>
Sun, 28 Jun 2020 13:29:33 +0000 (15:29 +0200)
committerAhmedEldeeb50 <ahmed.eldeeb.ext@orange.com>
Sun, 28 Jun 2020 13:29:33 +0000 (15:29 +0200)
Issue-ID: CCSDK-2483

Signed-off-by: AhmedEldeeb50 <ahmed.eldeeb.ext@orange.com>
Change-Id: I7e1c0f80eb9e6073a1eb472bd6f042e8545c5ab7

cds-ui/designer-client/src/app/common/core/services/api.typed.service.ts
cds-ui/designer-client/src/app/modules/feature-modules/packages/configuration-dashboard/configuration-dashboard.component.html
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/configuration-dashboard/configuration-dashboard.service.ts
cds-ui/server/src/controllers/blueprint-rest.controller.ts
cds-ui/server/src/datasources/blueprint.datasource-template.ts
cds-ui/server/src/services/blueprint.service.ts

index d4851de..b73d48e 100644 (file)
@@ -22,9 +22,9 @@ limitations under the License.
 ============LICENSE_END============================================
 */
 
-import {Injectable} from '@angular/core';
-import {HttpClient, HttpParams} from '@angular/common/http';
-import {Observable} from 'rxjs';
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpParams } from '@angular/common/http';
+import { Observable } from 'rxjs';
 
 @Injectable()
 export class ApiService<T> {
@@ -40,7 +40,7 @@ export class ApiService<T> {
                 httpParams = httpParams.append(key, params[key]);
             }
         }
-        const options = {params: httpParams};
+        const options = { params: httpParams };
         return this.httpClient.get<T[]>(url, options);
     }
 
@@ -49,6 +49,11 @@ export class ApiService<T> {
         return this.httpClient.post(url, body, options);
     }
 
+    delete(url: string, body: any | null): Observable<any> {
+
+        return this.httpClient.delete(url, body);
+    }
+
     getOne(url: string, params?: {}): Observable<T> {
         console.log('params', params);
         let httpParams = new HttpParams();
@@ -57,7 +62,7 @@ export class ApiService<T> {
                 httpParams = httpParams.append(key, params[key]);
             }
         }
-        const options = {params: httpParams};
+        const options = { params: httpParams };
         return this.httpClient.get<T>(url, options);
     }
 
index 18c9277..8e2ae5d 100644 (file)
@@ -48,7 +48,7 @@
                         <span>Download</span>
                     </a>
 
-                    <a class="action-button delete">
+                    <a data-target="#removePackageModal" data-toggle="modal" class="action-button">
                         <i class="icon-delete-sm" aria-hidden="true"></i>
                         <span>Delete</span>
                     </a>
             </div>
         </div>
     </div>
+</div>
+
+
+<!-- Delete Modal -->
+<div class="modal fade" id="removePackageModal" tabindex="-1" role="dialog" aria-labelledby="removePackageModalLabel"
+    aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="removePackageModalLabel">Delete Script</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <p>Are you sure you want to delete this package?</p>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
+                <button type="button" (click)="deletePackage()" data-dismiss="modal"
+                    class="btn btn-primary">Delete</button>
+            </div>
+        </div>
+    </div>
 </div>
\ No newline at end of file
index 0ff8d95..0e1d4cd 100644 (file)
@@ -36,6 +36,7 @@ export class ConfigurationDashboardComponent implements OnInit {
     zipFile: JSZip = new JSZip();
     filesData: any = [];
     folder: FolderNodeElement = new FolderNodeElement();
+    id: any;
 
     currentBlob = new Blob();
 
@@ -46,15 +47,14 @@ export class ConfigurationDashboardComponent implements OnInit {
         private packageCreationUtils: PackageCreationUtils,
         private router: Router,
         private designerStore: DesignerStore,
-        private designerService: DesignerService,
         private toastService: ToastrService
     ) {
     }
 
     ngOnInit() {
         this.elementRef.nativeElement.focus();
-        const id = this.route.snapshot.paramMap.get('id');
-        this.configurationDashboardService.getPagedPackages(id).subscribe(
+        this.id = this.route.snapshot.paramMap.get('id');
+        this.configurationDashboardService.getPagedPackages(this.id).subscribe(
             (bluePrintDetailModels) => {
                 if (bluePrintDetailModels) {
                     this.viewedPackage = bluePrintDetailModels[0];
@@ -62,8 +62,11 @@ export class ConfigurationDashboardComponent implements OnInit {
                     this.packageCreationStore.clear();
                 }
             });
-    }
 
+        if (this.route.snapshot.paramMap.has('id')) {
+            console.log('The id is equal to ' + this.route.snapshot.paramMap.get('id'));
+        }
+    }
 
     private downloadCBAPackage(bluePrintDetailModels: BluePrintDetailModel) {
         this.configurationDashboardService.downloadResource(
@@ -185,7 +188,15 @@ export class ConfigurationDashboardComponent implements OnInit {
             });
     }
 
-
+    deletePackage() {
+        this.configurationDashboardService.deletePackage(this.id).subscribe(res => {
+            console.log('Deleted');
+            console.log(res);
+            this.router.navigate(['/packages']);
+        }, err => {
+            console.log(err);
+        });
+    }
     create() {
         this.zipFile = new JSZip();
         FilesContent.getMapOfFilesNamesAndContent().forEach((value, key) => {
index 164d766..c7f5571 100644 (file)
@@ -1,8 +1,8 @@
-import {Injectable} from '@angular/core';
-import {ApiService} from '../../../../common/core/services/api.typed.service';
-import {BlueprintURLs} from '../../../../common/constants/app-constants';
-import {Observable} from 'rxjs';
-import {BluePrintDetailModel} from '../model/BluePrint.detail.model';
+import { Injectable } from '@angular/core';
+import { ApiService } from '../../../../common/core/services/api.typed.service';
+import { BlueprintURLs } from '../../../../common/constants/app-constants';
+import { Observable } from 'rxjs';
+import { BluePrintDetailModel } from '../model/BluePrint.detail.model';
 
 
 @Injectable({
@@ -22,10 +22,13 @@ export class ConfigurationDashboardService {
     }
 
     public downloadResource(path: string) {
-        return this.api.getCustomized(BlueprintURLs.download + path, {responseType: 'blob'});
+        return this.api.getCustomized(BlueprintURLs.download + path, { responseType: 'blob' });
     }
 
     deployPost(body: any | null): Observable<any> {
-        return this.api.post(BlueprintURLs.deploy, body, {responseType: 'text'});
+        return this.api.post(BlueprintURLs.deploy, body, { responseType: 'text' });
+    }
+    deletePackage(id: string) {
+        return this.api.delete(BlueprintURLs.getOneBlueprint + '/' + id, { observe: 'response' });
     }
 }
index 2319e0a..870f979 100644 (file)
@@ -20,16 +20,16 @@ limitations under the License.
 */
 
 
-import {get, param, post, Request, requestBody, Response, RestBindings} from '@loopback/rest';
-import {Blueprint} from '../models';
-import {inject} from '@loopback/core';
-import {BlueprintService} from '../services';
+import { get, param, post, Request, requestBody, Response, RestBindings, del } from '@loopback/rest';
+import { Blueprint } from '../models';
+import { inject } from '@loopback/core';
+import { BlueprintService } from '../services';
 import * as fs from 'fs';
 import * as multiparty from 'multiparty';
 import * as request_lib from 'request';
-import {appConfig, processorApiConfig} from '../config/app-config';
-import {bluePrintManagementServiceGrpcClient} from '../clients/blueprint-management-service-grpc-client';
-import {BlueprintDetail} from '../models/blueprint.detail.model';
+import { appConfig, processorApiConfig } from '../config/app-config';
+import { bluePrintManagementServiceGrpcClient } from '../clients/blueprint-management-service-grpc-client';
+import { BlueprintDetail } from '../models/blueprint.detail.model';
 
 export class BlueprintRestController {
   constructor(
@@ -42,7 +42,7 @@ export class BlueprintRestController {
     responses: {
       '200': {
         description: 'Blueprint model instance',
-        content: {'application/json': {schema: {'x-ts-type': Blueprint}}},
+        content: { 'application/json': { schema: { 'x-ts-type': Blueprint } } },
       },
     },
   })
@@ -54,7 +54,7 @@ export class BlueprintRestController {
     responses: {
       '200': {
         description: 'Blueprint model instance',
-        content: {'application/json': {schema: {'x-ts-type': BlueprintDetail}}},
+        content: { 'application/json': { schema: { 'x-ts-type': BlueprintDetail } } },
       },
     },
   })
@@ -62,12 +62,24 @@ export class BlueprintRestController {
     return await this.bpservice.getOneBluePrint(id);
   }
 
+  @del('/controllerblueprint/{id}', {
+    responses: {
+      '200': {
+        description: 'Blueprint model instance',
+        content: { 'application/json': { schema: { 'x-ts-type': BlueprintDetail } } },
+      },
+    },
+  })
+  async deleteBluePrint(@param.path.string('id') id: string) {
+    return await this.bpservice.deleteBluePrint(id);
+  }
+
 
   @get('/controllerblueprint/paged', {
     responses: {
       '200': {
         description: 'Blueprint model instance with pagination',
-        content: {'application/json': {schema: {'x-ts-type': Blueprint}}},
+        content: { 'application/json': { schema: { 'x-ts-type': Blueprint } } },
       },
     },
   })
@@ -83,7 +95,7 @@ export class BlueprintRestController {
     responses: {
       '200': {
         description: 'Blueprint model instance with pagination',
-        content: {'application/json': {schema: {'x-ts-type': Blueprint}}},
+        content: { 'application/json': { schema: { 'x-ts-type': Blueprint } } },
       },
     },
   })
@@ -100,7 +112,7 @@ export class BlueprintRestController {
     responses: {
       '200': {
         description: 'Blueprint model instance',
-        content: {'application/json': {schema: {'x-ts-type': Blueprint}}},
+        content: { 'application/json': { schema: { 'x-ts-type': Blueprint } } },
       },
     },
   })
@@ -112,7 +124,7 @@ export class BlueprintRestController {
     responses: {
       '200': {
         description: 'Blueprint model instance',
-        content: {'application/json': {schema: {'x-ts-type': Blueprint}}},
+        content: { 'application/json': { schema: { 'x-ts-type': Blueprint } } },
       },
     },
   })
@@ -123,7 +135,7 @@ export class BlueprintRestController {
   @get('/controllerblueprint/searchByTags/{tags}', {
     responses: {
       '200': {
-        content: {'application/json': {}},
+        content: { 'application/json': {} },
       },
     },
   })
@@ -140,11 +152,11 @@ export class BlueprintRestController {
         'multipart/form-data': {
           // Skip body parsing
           'x-parser': 'stream',
-          schema: {type: 'object'},
+          schema: { type: 'object' },
         },
       },
     })
-      request: Request,
+    request: Request,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
     return new Promise((resolve, reject) => {
@@ -180,11 +192,11 @@ export class BlueprintRestController {
         'multipart/form-data': {
           // Skip body parsing
           'x-parser': 'stream',
-          schema: {type: 'object'},
+          schema: { type: 'object' },
         },
       },
     })
-      request: Request,
+    request: Request,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
     return new Promise((resolve, reject) => {
@@ -220,11 +232,11 @@ export class BlueprintRestController {
         'multipart/form-data': {
           // Skip body parsing
           'x-parser': 'stream',
-          schema: {type: 'object'},
+          schema: { type: 'object' },
         },
       },
     })
-      request: Request,
+    request: Request,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
     return new Promise((resolve, reject) => {
@@ -261,7 +273,7 @@ export class BlueprintRestController {
   async getFileFromMultiPartForm(request: Request): Promise<multiparty.File> {
     return new Promise((resolve, reject) => {
       let form = new multiparty.Form();
-      form.parse(request, (err: any, fields: any, files: {[x: string]: any[];}) => {
+      form.parse(request, (err: any, fields: any, files: { [x: string]: any[]; }) => {
         if (err) reject(err);
         let file = files['file'][0]; // get the file from the returned files object
         if (!file) {
@@ -282,11 +294,11 @@ export class BlueprintRestController {
         'multipart/form-data': {
           // Skip body parsing
           'x-parser': 'stream',
-          schema: {type: 'object'},
+          schema: { type: 'object' },
         },
       },
     })
-      request: Request,
+    request: Request,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
     return new Promise((resolve, reject) => {
index 9b8e06a..3b502d3 100644 (file)
@@ -1,4 +1,4 @@
-import {processorApiConfig} from '../config/app-config';
+import { processorApiConfig } from '../config/app-config';
 
 export default {
     "name": "blueprint",
@@ -37,84 +37,100 @@ export default {
 
         }
     },
-
-        {
-            "template": {
-                "method": "GET",
-                "url": processorApiConfig.http.url + "/blueprint-model/search/{tags}",
-                "headers": {
-                    "accepts": "application/json",
-                    "content-type": "application/json",
-                    "authorization": processorApiConfig.http.authToken
-                },
-                "responsePath": "$.*"
+    {
+        "template": {
+            "method": "DELETE",
+            "url": processorApiConfig.http.url + "/blueprint-model/{id}",
+            "headers": {
+                "accepts": "application/json",
+                "content-type": "application/json",
+                "authorization": processorApiConfig.http.authToken
             },
-            "functions": {
-                "getByTags": ["tags"]
-
-            }
+            "responsePath": "$.*"
         },
-        {
-            "template": {
-                "method": "GET",
-                "url": processorApiConfig.http.url + "/blueprint-model/meta-data/{keyword}",
-                "headers": {
-                    "accepts": "application/json",
-                    "content-type": "application/json",
-                    "authorization": processorApiConfig.http.authToken
-                },
-                "responsePath": "$.*"
+        "functions": {
+            "deleteBluePrint": ["id"]
+
+        }
+    },
+
+    {
+        "template": {
+            "method": "GET",
+            "url": processorApiConfig.http.url + "/blueprint-model/search/{tags}",
+            "headers": {
+                "accepts": "application/json",
+                "content-type": "application/json",
+                "authorization": processorApiConfig.http.authToken
             },
-            "functions": {
-                "getBlueprintsByKeyword": ["keyword"]
+            "responsePath": "$.*"
+        },
+        "functions": {
+            "getByTags": ["tags"]
 
-            }
+        }
+    },
+    {
+        "template": {
+            "method": "GET",
+            "url": processorApiConfig.http.url + "/blueprint-model/meta-data/{keyword}",
+            "headers": {
+                "accepts": "application/json",
+                "content-type": "application/json",
+                "authorization": processorApiConfig.http.authToken
+            },
+            "responsePath": "$.*"
         },
-        {
-            "template": {
-                "method": "GET",
-                "url": processorApiConfig.http.url + "/blueprint-model/paged?limit={limit}&offset={offset}&sort={sort}&sortType={sortType}",
-                "headers": {
-                    "accepts": "application/json",
-                    "content-type": "application/json",
-                    "authorization": processorApiConfig.http.authToken
-                },
-                "responsePath": "$",
+        "functions": {
+            "getBlueprintsByKeyword": ["keyword"]
+
+        }
+    },
+    {
+        "template": {
+            "method": "GET",
+            "url": processorApiConfig.http.url + "/blueprint-model/paged?limit={limit}&offset={offset}&sort={sort}&sortType={sortType}",
+            "headers": {
+                "accepts": "application/json",
+                "content-type": "application/json",
+                "authorization": processorApiConfig.http.authToken
             },
-            "functions": {
-                "getPagedBueprints": ["limit", "offset", "sort","sortType"],
-            }
+            "responsePath": "$",
         },
-        {
-            "template": {
-                "method": "GET",
-                "url": processorApiConfig.http.url + "/blueprint-model/paged/meta-data/{keyword}?limit={limit}&offset={offset}&sort={sort}&sortType={sortType}",
-                "headers": {
-                    "accepts": "application/json",
-                    "content-type": "application/json",
-                    "authorization": processorApiConfig.http.authToken
-                },
-                "responsePath": "$",
+        "functions": {
+            "getPagedBueprints": ["limit", "offset", "sort", "sortType"],
+        }
+    },
+    {
+        "template": {
+            "method": "GET",
+            "url": processorApiConfig.http.url + "/blueprint-model/paged/meta-data/{keyword}?limit={limit}&offset={offset}&sort={sort}&sortType={sortType}",
+            "headers": {
+                "accepts": "application/json",
+                "content-type": "application/json",
+                "authorization": processorApiConfig.http.authToken
             },
-            "functions": {
-                "getMetaDataPagedBlueprints": ["limit", "offset", "sort", "keyword","sortType"],
-            }
+            "responsePath": "$",
         },
-        {
-            "template": {
-                "method": "GET",
-                "url": processorApiConfig.http.url + "/blueprint-model/by-name/{name}/version/{version}",
-                "headers": {
-                    "accepts": "application/json",
-                    "content-type": "application/json",
-                    "authorization": processorApiConfig.http.authToken
-                },
-                "responsePath": "$",
+        "functions": {
+            "getMetaDataPagedBlueprints": ["limit", "offset", "sort", "keyword", "sortType"],
+        }
+    },
+    {
+        "template": {
+            "method": "GET",
+            "url": processorApiConfig.http.url + "/blueprint-model/by-name/{name}/version/{version}",
+            "headers": {
+                "accepts": "application/json",
+                "content-type": "application/json",
+                "authorization": processorApiConfig.http.authToken
             },
-            "functions": {
-                "getBlueprintByNameAndVersion": ["name", "version"],
-            }
+            "responsePath": "$",
         },
+        "functions": {
+            "getBlueprintByNameAndVersion": ["name", "version"],
+        }
+    },
     ]
 
 };
index 2680e10..379f8d4 100644 (file)
@@ -1,15 +1,16 @@
-import {getService} from '@loopback/service-proxy';
-import {inject, Provider} from '@loopback/core';
-import {BlueprintDataSource} from '../datasources';
+import { getService } from '@loopback/service-proxy';
+import { inject, Provider } from '@loopback/core';
+import { BlueprintDataSource } from '../datasources';
 
 export interface BlueprintService {
-    getOneBluePrint(id: string): any;
-   getAllblueprints(): Promise<any>;
-   getBlueprintsByKeyword(keyword: string): Promise<any>;
-   getByTags(tags: string): Promise<JSON>;
-   getPagedBueprints(limit: number, offset: number , sort: string,sortType: String): Promise<any>;
-   getMetaDataPagedBlueprints(limit: number, offset: number, sort: string, keyword: string,sortType: String): Promise<any>;
-   getBlueprintByNameAndVersion(name:string, version:string): Promise<any>;
+  getOneBluePrint(id: string): any;
+  deleteBluePrint(id: string): any;
+  getAllblueprints(): Promise<any>;
+  getBlueprintsByKeyword(keyword: string): Promise<any>;
+  getByTags(tags: string): Promise<JSON>;
+  getPagedBueprints(limit: number, offset: number, sort: string, sortType: String): Promise<any>;
+  getMetaDataPagedBlueprints(limit: number, offset: number, sort: string, keyword: string, sortType: String): Promise<any>;
+  getBlueprintByNameAndVersion(name: string, version: string): Promise<any>;
 
 
 }
@@ -19,7 +20,7 @@ export class BlueprintServiceProvider implements Provider<BlueprintService> {
     // blueprint must match the name property in the datasource json file
     @inject('datasources.blueprint')
     protected dataSource: BlueprintDataSource = new BlueprintDataSource(),
-  ) {}
+  ) { }
 
   value(): Promise<BlueprintService> {
     return getService(this.dataSource);