Merge from ecomp 718fd196 - Modern UI

Issue-ID: VID-378

Change-Id: I2736b98426e324ec3aa233b034229ba84d99839f
Signed-off-by: Ittay Stern <ittay.stern@att.com>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html
index f02ed62..4680760 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html
@@ -10,7 +10,7 @@
               </svg-icon>
     </span>
 
-    <div class="header-col middleDetails" style="padding-top: 5px;padding-left: 13px;line-height: 100%;" *ngIf="isServiceFailed">
+    <div class="header-col middleDetails" style="padding-top: 7px;padding-left: 13px;line-height: 100%;" *ngIf="isServiceFailed">
       <custom-popover class="failed-popover-wrap" [value]= "serviceStatusMessage" [placement]="'bottom'" [popoverType]="'error'">
         <span [attr.data-tests-id]="'service-failed-msg'" class="failed-msg labelPosition" >Failed</span>
       </custom-popover>
@@ -22,7 +22,9 @@
     <div class="header-col middleDetails notShowOnCreateMode"
          style="padding-top: 0px;padding-left: 13px;line-height: 100%;">
       <span [attr.data-tests-id]="'orchStatusLabel'" class="service-instance-label labelPosition">Orch Status:</span>
-      <span [attr.data-tests-id]="'orchStatusValue'" class="orch-status-value">{{serviceOrchStatus}}</span>
+      <span [attr.data-tests-id]="'orchStatusValue'"
+            [ngClass]="{'tag-status-value' :serviceOrchStatus?.toLowerCase()!= 'active'}"
+            class="orch-status-value">{{serviceOrchStatus}}</span>
     </div>
     <div class="quantity-container header-col middleDetails"
          style="padding-top: 0px;padding-left: 13px;line-height: 100%;"
@@ -38,6 +40,8 @@
 
 
   <div class="right-header">
+    <span class="action-status-type-header delete" [attr.data-tests-id]="'delete-status-type-header'" *ngIf="isDeleted === true">Delete</span>
+    <span class="action-status-type-header resume" [attr.data-tests-id]="'resume-status-type-header'" *ngIf="isResume === true">Resume</span>
     <span class="menu-container notShowOnViewMode notShowOnRetryMode">
       <span [attr.data-tests-id]="'openMenuBtn'" class="icon-browse" (click)="onContextMenu($event)"></span>
       <context-menu>
@@ -46,7 +50,7 @@
             <span class="icon-edit"></span>Edit</div>
         </ng-template>
         <ng-template *ngIf="mode === 'EDIT'" contextMenuItem
-                     (execute)="isDeleted=!isDeleted; drawingBoardHeaderService.deleteService(serviceModelId,isDeleted)">
+                     (execute)="onDeleteUndoDeleteClick()">
           <div [attr.data-tests-id]="'context-menu-header-delete-item'"><span class="icon-trash"></span>{{isDeleted ? 'Undo delete': 'Delete'}}</div>
         </ng-template>
         <ng-template *ngIf="mode !== 'CREATE'" contextMenuItem
@@ -60,6 +64,10 @@
                 </svg-icon></div>
                 <div style="padding-left: 12px;">Show Audit Info</div>
         </ng-template>
+        <ng-template *ngIf="drawingBoardHeaderService?.showResumeService(serviceModelId)" contextMenuItem
+                     (execute)="onResumeUndoResumeClick()">
+          <div [attr.data-tests-id]="'context-menu-header-resume-item'"><span class="icon-trash"></span>{{isResume ? 'Undo resume': 'Resume'}}</div>
+        </ng-template>
       </context-menu>
     </span>
     <button [disabled]="drawingBoardHeaderService?.deployShouldBeDisabled(serviceModelId, mode)"
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss
index 1242f94..353c115 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss
@@ -85,6 +85,13 @@
         font-family: OpenSans-Regular;
         font-size: 14px;
         color: #191919;
+        &.tag-status-value {
+          background: #009fdb;
+          color: white;
+          border-radius: 2px;
+          text-align: center;
+          padding: 5px;
+        }
       }
       .scale-value {
         font-family: OpenSans-Regular;
@@ -111,9 +118,25 @@
         height: 45px;
       }
     }
+
     .right-header {
       display: flex;
       align-items: center;
+      .action-status-type-header {
+          background: transparent;
+          font-family: OpenSans-SemiBold;
+          font-size: 12px;
+          border-radius: 50px;
+          border: 1px solid gray;
+          padding: 5px 20px;
+          margin-right: 10px;
+        &.delete {
+          color: red;
+        }
+        &.resume {
+          color: #009fdb;
+        }
+      }
       .quantity-container {
         .quantity-label {
           padding-left: 10px;
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts
index 6e43915..51f9053 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts
@@ -39,6 +39,7 @@
   mode : DrawingBoardModes = DrawingBoardModes.CREATE;
   serviceOrchStatus: string;
   isDeleted: boolean = false;
+  isResume: boolean = false;
   store : NgRedux<AppState>;
   drawingBoardPermissions : DrawingBoardPermissions;
   drawingBoardHeaderService : DrawingBoardHeaderService;
@@ -122,7 +123,7 @@
       type: PopupType.SERVICE,
       uuidData: <any>{
         type : PopupType.SERVICE,
-        isMacro : this.store.getState().service.serviceHierarchy[this.serviceModelId].service.instantiationType === 'Macro',
+        isMacro : this.store.getState().service.serviceHierarchy[this.serviceModelId].service.vidNotions.instantiationType === 'Macro',
         serviceId: this.serviceModelId,
         popupService: this._servicePopupService
       },
@@ -130,6 +131,32 @@
     });
   }
 
+  onDeleteUndoDeleteClick(){
+    this.cancelResume(this.serviceModelId);
+    this.isDeleted = !this.isDeleted;
+    this._drawingBoardHeaderService.deleteService(this.serviceModelId, this.isDeleted)
+  }
+
+  onResumeUndoResumeClick(){
+    this.cancelDelete(this.serviceModelId);
+    this.isResume = !this.isResume;
+    this._drawingBoardHeaderService.toggleResumeService(this.serviceModelId, this.isResume);
+  }
+
+  cancelDelete(serviceModelId: string) {
+    if (this.isDeleted) {
+      this.isDeleted = false;
+      this._drawingBoardHeaderService.deleteService(serviceModelId,this.isDeleted);
+    }
+  }
+
+  cancelResume(serviceModelId: string) {
+    if (this.isResume) {
+      this.isResume = false;
+      this._drawingBoardHeaderService.toggleResumeService(serviceModelId,this.isResume);
+    }
+  }
+
   extractOwningEntityNameAccordingtoId(id:String): string {
     let owningEntityName;
     _.forEach(this.store.getState().service.categoryParameters.owningEntityList,(owningEntity: OwningEntity) => {
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts
index bcf6753..76fc28a 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts
@@ -85,7 +85,7 @@
   });
 
   test('deployShouldBeDisabled with validationCounter greater then 0',()=>{
-    jest.spyOn(store, 'getState').mockReturnValue({
+    jest.spyOn(store, 'getState').mockReturnValue(<any>{
       service: {
         serviceInstance : {
           'serviceInstanceId' : {
@@ -94,12 +94,12 @@
         }
       }
     });
-    let result = service.deployShouldBeDisabled("serviceInstanceId");
+    let result = service.deployShouldBeDisabled("serviceInstanceId", DrawingBoardModes.RETRY_EDIT);
     expect(result).toBeTruthy();
   });
 
   test('deployShouldBeDisabled with validationCounter is 0 and not dirty',()=>{
-    jest.spyOn(store, 'getState').mockReturnValue({
+    jest.spyOn(store, 'getState').mockReturnValue(<any>{
       service: {
         serviceInstance : {
           'serviceInstanceId' : {
@@ -109,12 +109,12 @@
         }
       }
     });
-    let result = service.deployShouldBeDisabled("serviceInstanceId");
+    let result = service.deployShouldBeDisabled("serviceInstanceId", DrawingBoardModes.RETRY_EDIT);
     expect(result).toBeFalsy();
   });
 
   test('deployShouldBeDisabled with validationCounter is 0 and dirty',()=>{
-    jest.spyOn(store, 'getState').mockReturnValue({
+    jest.spyOn(store, 'getState').mockReturnValue(<any>{
       service: {
         serviceInstance : {
           'serviceInstanceId' : {
@@ -125,12 +125,12 @@
         }
       }
     });
-    let result = service.deployShouldBeDisabled("serviceInstanceId");
+    let result = service.deployShouldBeDisabled("serviceInstanceId", DrawingBoardModes.RETRY_EDIT);
     expect(result).not.toBeTruthy();
   });
 
   test('deployShouldBeDisabled with validationCounter is 0 and not and action is None and dirty',()=>{
-    jest.spyOn(store, 'getState').mockReturnValue({
+    jest.spyOn(store, 'getState').mockReturnValue(<any>{
       service: {
         serviceInstance : {
           'serviceInstanceId' : {
@@ -141,7 +141,7 @@
         }
       }
     });
-    let result = service.deployShouldBeDisabled("serviceInstanceId");
+    let result = service.deployShouldBeDisabled("serviceInstanceId", DrawingBoardModes.RETRY_EDIT);
     expect(result).not.toBeTruthy();
   });
 
@@ -157,8 +157,8 @@
     expect(result).toEqual('REDEPLOY');
   });
   test('getButtonText',()=>{
-    expect(service.getButtonText("VIEW")).toEqual('EDIT');
-    expect(service.getButtonText("RETRY")).toEqual('REDEPLOY');
+    expect(service.getButtonText(DrawingBoardModes.VIEW)).toEqual('EDIT');
+    expect(service.getButtonText(DrawingBoardModes.RETRY)).toEqual('REDEPLOY');
 
   });
   const showEditServiceDataProvider = [
@@ -169,7 +169,7 @@
     ['None action EDIT mode',DrawingBoardModes.EDIT,  ServiceInstanceActions.None, false],
     ['None action RETRY_EDIT mode', DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.None, false]];
   each(showEditServiceDataProvider).test('showEditService service with %s', (description, mode, action, enabled) => {
-    jest.spyOn(store, 'getState').mockReturnValue({
+    jest.spyOn(store, 'getState').mockReturnValue(<any>{
       service: {
         serviceInstance : {
           'serviceInstanceId' : {
@@ -181,4 +181,49 @@
     expect(service.showEditService(mode, 'serviceInstanceId')).toBe(enabled);
 
   });
+
+  const showResumeServiceDataProvider = [
+    ['all conditions of resume- should show resume',true, 'MACRO', 'VPE', 'AssiGNed', true],
+    ['flag is disabled- should not show resume ',false, 'MACRO', 'VPE', 'AssiGNed', false],
+    ['transport service (PNF)- should not show resume', true, 'Macro', 'transport', 'Assigned', false],
+    ['instantiationType is a-la-carte- should not show resume', true, 'ALaCarte', 'VPE', 'Assigned', false],
+    ['orchestration Status is not assigned- should not show resume', true, 'Macro', 'VPE', 'Created', false],
+    ['orchestration Status is Inventoried - should show resume', true, 'Macro', 'VPE', 'iNventOriEd', true]
+  ];
+
+  each(showResumeServiceDataProvider).test('showResumeService when %s', (description, flagResumeMacroService,instantiationType, subscriptionServiceType, orchStatus, shouldShowResumeService) => {
+    jest.spyOn(store, 'getState').mockReturnValue(<any>{
+      global: {
+        flags:{
+          'FLAG_1908_RESUME_MACRO_SERVICE': flagResumeMacroService
+        }
+      },
+      service: {
+        serviceInstance : {
+          'serviceModelId' : {
+            'vidNotions': {
+              'instantiationType': instantiationType
+            },
+            'subscriptionServiceType':subscriptionServiceType,
+            'orchStatus': orchStatus
+          }
+        }
+      }
+    });
+    expect(service.showResumeService('serviceModelId')).toBe(shouldShowResumeService);
+
+  });
+
+
+  const toggleResumeServiceDataProvider = [
+    [ServiceInstanceActions.None, true],
+    [ServiceInstanceActions.Resume, false]
+  ];
+
+  each(toggleResumeServiceDataProvider).test('toggleResumeService - should call %s for resume/ undo Resume',(serviceAction, isResume)=>{
+    jest.spyOn(store, 'dispatch');
+    service.toggleResumeService("serviceInstanceId", isResume);
+    expect(store.dispatch).toHaveBeenCalledWith(addServiceAction("serviceInstanceId", serviceAction));
+  });
+
 });
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts
index 946c5ca..7df2f3a 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts
@@ -11,6 +11,7 @@
 import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
 import {DrawingBoardModes} from "../drawing-board.modes";
 import {ServiceInstance} from "../../../shared/models/serviceInstance";
+import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service";
 
 @Injectable()
 export class DrawingBoardHeaderService{
@@ -38,7 +39,13 @@
   showAuditInfo(serviceModelId) : void {
     let instance: ServiceInstance = this.store.getState().service.serviceInstance[serviceModelId];
     let model =  new ServiceModel(this.store.getState().service.serviceHierarchy[serviceModelId]);
-    AuditInfoModalComponent.openInstanceAuditInfoModal.next({instanceId : serviceModelId , type : 'SERVICE', model : model , instance : instance, trackById: instance.trackById});
+    AuditInfoModalComponent.openInstanceAuditInfoModal.next({instanceId : serviceModelId , type : 'SERVICE', model : model , instance : instance});
+  }
+
+  toggleResumeService(serviceModelId, isResume: boolean) : void {
+    const action: ServiceInstanceActions = isResume ? ServiceInstanceActions.Resume : ServiceInstanceActions.None;
+    this.store.dispatch(addServiceAction(serviceModelId, action));
+
   }
 
 
@@ -49,7 +56,7 @@
     const serviceInstance = this.store.getState().service.serviceInstance[serviceInstanceId];
     if(!_.isNil(serviceInstance)){
       const validationCounter = serviceInstance.validationCounter;
-      if (!_.isNil(this.errorMsgService.errorMsgObject)&& mode !== DrawingBoardModes.RETRY_EDIT) return true;
+      if (!_.isNil(this.errorMsgService.errorMsgObject) && mode !== DrawingBoardModes.RETRY_EDIT) return true;
       if(validationCounter > 0) return true;
       if(serviceInstance.action !== ServiceInstanceActions.None) return false;
       if(mode === DrawingBoardModes.RETRY_EDIT) return false;
@@ -83,4 +90,18 @@
     return mode === DrawingBoardModes.CREATE || ((mode === DrawingBoardModes.RETRY_EDIT || mode === DrawingBoardModes.EDIT)&&
       !_.isNil(serviceInstance) && !_.isNil(serviceInstance[serviceModelId])&& serviceInstance[serviceModelId].action === ServiceInstanceActions.Create);
   }
+
+  showResumeService(serviceModelId: string): boolean {
+    const serviceInstance: ServiceInstance = !_.isNil(this.store.getState().service.serviceInstance)? this.store.getState().service.serviceInstance[serviceModelId] : null;
+    if (serviceInstance)
+    {
+      return FeatureFlagsService.getFlagState(Features.FLAG_1908_RESUME_MACRO_SERVICE, this.store) &&
+        serviceInstance.vidNotions.instantiationType.toLowerCase() === "macro" &&
+        serviceInstance.subscriptionServiceType.toLowerCase() !== "transport" &&
+        serviceInstance.orchStatus &&
+        (serviceInstance.orchStatus.toLowerCase() === "assigned" ||
+          serviceInstance.orchStatus.toLowerCase() === "inventoried");
+    }
+    return false;
+  }
 }