Angular upgrade 14/14414/3 master
authorSANDHYA.JS <sandhya.j@tataelxsi.co.in>
Tue, 4 Jun 2024 16:20:03 +0000 (21:50 +0530)
committerSANDHYA.JS <sandhya.j@tataelxsi.co.in>
Wed, 5 Jun 2024 09:22:24 +0000 (14:52 +0530)
- Upgraded Angular from 14 to 15 version.

Change-Id: I2339a04020153cbc9ed7a14bfe8e0aa265e507da
Signed-off-by: SANDHYA.JS <sandhya.j@tataelxsi.co.in>
133 files changed:
angular.json
package.json
src/app/AppComponent.ts
src/app/AppModule.ts
src/app/dashboard/DashboardComponent.html
src/app/dashboard/DashboardComponent.scss
src/app/dashboard/DashboardComponent.ts
src/app/instances/netslice-instances/NetsliceInstancesComponent.html
src/app/instances/ns-history-operations/HistoryOperationsComponent.html
src/app/instances/ns-history-operations/HistoryOperationsComponent.ts
src/app/instances/ns-instances/NSInstancesComponent.html
src/app/instances/ns-instances/NSInstancesComponent.ts
src/app/instances/ns-primitive/NSPrimitiveComponent.html
src/app/instances/ns-primitive/NSPrimitiveComponent.ts
src/app/instances/ns-topology/NSTopologyComponent.html
src/app/instances/ns-topology/NSTopologyComponent.ts
src/app/instances/pdu-instances/PDUInstancesComponent.html
src/app/instances/pdu-instances/add-pdu-instances/AddPDUInstancesComponent.html
src/app/instances/pdu-instances/add-pdu-instances/AddPDUInstancesComponent.scss
src/app/instances/vnf-instances/VNFInstancesComponent.html
src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.html
src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.ts
src/app/k8s/k8s-add-repo/K8sAddRepoComponent.html
src/app/k8s/k8scluster/K8sClusterComponent.html
src/app/k8s/k8srepository/K8sRepositoryComponent.html
src/app/layouts/LayoutComponent.html
src/app/layouts/breadcrumb/BreadcrumbComponent.html
src/app/layouts/breadcrumb/BreadcrumbComponent.ts
src/app/layouts/header/HeaderComponent.html
src/app/layouts/header/HeaderComponent.scss
src/app/layouts/header/HeaderComponent.ts
src/app/layouts/sidebar/SidebarComponent.ts
src/app/login/LoginComponent.ts
src/app/operational-view/OperationalViewComponent.html
src/app/operational-view/OperationalViewComponent.ts
src/app/operational-view/operational-view-app-actions/OperationalViewAppActionsComponent.ts
src/app/operational-view/operational-view-app-configs/OperationalViewAppConfigsComponent.ts
src/app/operational-view/operational-view-app-executed-actions/OperationalViewAppExecutedActionsComponent.ts
src/app/osm-repositories/osm-repo-create-update/OsmRepoCreateUpdateComponent.html
src/app/osm-repositories/osm-repositories-details/OsmRepositoriesDetailsComponent.html
src/app/packages/instantiate-net-slice-template/InstantiateNetSliceTemplateComponent.html
src/app/packages/instantiate-net-slice-template/InstantiateNetSliceTemplateComponent.ts
src/app/packages/instantiate-ns/InstantiateNsComponent.html
src/app/packages/instantiate-ns/InstantiateNsComponent.ts
src/app/packages/netslice-template/NetsliceTemplateComponent.html
src/app/packages/ns-packages/NSPackagesComponent.html
src/app/packages/ns-packages/ns-composer/NSComposerComponent.html
src/app/packages/ns-packages/ns-composer/NSComposerComponent.scss
src/app/packages/ns-packages/ns-composer/NSComposerComponent.ts
src/app/packages/ns-packages/vnf-composer/VNFComposerComponent.html
src/app/packages/ns-packages/vnf-composer/VNFComposerComponent.scss
src/app/packages/ns-packages/vnf-composer/VNFComposerComponent.ts
src/app/packages/vnf-packages/VNFPackagesComponent.html
src/app/projects/ProjectsComponent.html
src/app/projects/ProjectsComponent.ts
src/app/projects/project-create-update/ProjectCreateUpdateComponent.html
src/app/projects/project-create-update/ProjectCreateUpdateComponent.scss
src/app/projects/project-create-update/ProjectCreateUpdateComponent.ts
src/app/roles/roles-create-edit/RolesCreateEditComponent.html
src/app/roles/roles-create-edit/RolesCreateEditComponent.scss
src/app/roles/roles-create-edit/RolesCreateEditComponent.ts
src/app/roles/roles-details/RolesDetailsComponent.html
src/app/roles/roles-details/RolesDetailsComponent.ts
src/app/sdn-controller/new-sdn-controller/NewSDNControllerComponent.html
src/app/sdn-controller/sdn-controller-details/SDNControllerDetailsComponent.html
src/app/sdn-controller/sdn-controller-info/SDNControllerInfoComponent.html
src/app/sdn-controller/sdn-controller-info/SDNControllerInfoComponent.scss
src/app/users/add-user/AddEditUserComponent.html
src/app/users/add-user/AddEditUserComponent.scss
src/app/users/add-user/AddEditUserComponent.ts
src/app/users/project-role/ProjectRoleComponent.html
src/app/users/project-role/ProjectRoleComponent.scss
src/app/users/user-details/UserDetailsComponent.html
src/app/users/user-details/UserDetailsComponent.ts
src/app/utilities/compose-packages/ComposePackages.html
src/app/utilities/confirmation-topology/ConfirmationTopologyComponent.html
src/app/utilities/edit-packages/EditPackagesComponent.html
src/app/utilities/edit-packages/EditPackagesComponent.scss
src/app/utilities/healing/HealingComponent.html [new file with mode: 0644]
src/app/utilities/healing/HealingComponent.scss [new file with mode: 0644]
src/app/utilities/healing/HealingComponent.ts [new file with mode: 0644]
src/app/utilities/ns-instances-action/NSInstancesActionComponent.html
src/app/utilities/ns-instances-action/NSInstancesActionComponent.ts
src/app/utilities/ns-update/NsUpdateComponent.html
src/app/utilities/ns-update/NsUpdateComponent.ts
src/app/utilities/page-per-row/PagePerRow.html
src/app/utilities/projects-action/ProjectsActionComponent.html
src/app/utilities/roles-action/RolesActionComponent.html
src/app/utilities/scaling/ScalingComponent.html
src/app/utilities/scaling/ScalingComponent.ts
src/app/utilities/start-stop-rebuild/StartStopRebuildComponent.ts
src/app/utilities/users-action/UsersActionComponent.html
src/app/utilities/users-action/UsersActionComponent.ts
src/app/utilities/vertical-scaling/VerticalScalingComponent.html
src/app/utilities/vertical-scaling/VerticalScalingComponent.ts
src/app/utilities/vim-accounts-action/VimAccountsActionComponent.html
src/app/utilities/vim-accounts-action/VimAccountsActionComponent.scss
src/app/utilities/vm-migration/VmMigrationComponent.html
src/app/utilities/vm-migration/VmMigrationComponent.ts
src/app/utilities/warning/WarningComponent.html
src/app/vim-accounts/Resources-Overview/ResourcesOverviewComponent.html
src/app/vim-accounts/Resources-Overview/ResourcesOverviewComponent.scss
src/app/vim-accounts/info-vim/InfoVimComponent.html
src/app/vim-accounts/info-vim/InfoVimComponent.scss
src/app/vim-accounts/info-vim/InfoVimComponent.ts
src/app/vim-accounts/new-vimaccount/NewVimaccountComponent.html
src/app/vim-accounts/new-vimaccount/NewVimaccountComponent.scss
src/app/vim-accounts/new-vimaccount/NewVimaccountComponent.ts
src/app/vim-accounts/vim-account-details/VimAccountDetailsComponent.html
src/app/vim-accounts/vim-account-details/VimAccountDetailsComponent.scss
src/app/vim-accounts/vim-account-details/VimAccountDetailsComponent.ts
src/app/wim-accounts/new-wim-account/NewWIMAccountComponent.html
src/app/wim-accounts/new-wim-account/NewWIMAccountComponent.ts
src/app/wim-accounts/wim-account-details/WIMAccountDetailsComponent.html
src/app/wim-accounts/wim-account-info/WIMAccountInfoComponent.html
src/app/wim-accounts/wim-account-info/WIMAccountInfoComponent.scss
src/assets/i18n/de.json
src/assets/i18n/en.json
src/assets/i18n/es.json
src/assets/i18n/pt.json
src/assets/scss/app.scss
src/assets/scss/style.scss
src/assets/scss/variable.scss
src/models/CommonModel.ts
src/models/MenuModel.ts
src/models/NSInstanceModel.ts
src/services/AcessGuardService.ts
src/services/AuthGuardService.ts
src/services/AuthenticationService.ts
src/services/RestService.ts
src/services/SharedService.ts
src/test.ts
tsconfig.json

index 1a6d042..066e675 100644 (file)
                                     "type": "initial",
                                     "maximumWarning": "2mb",
                                     "maximumError": "5mb"
+                                },
+                                {
+                                    "type": "anyComponentStyle",
+                                    "maximumWarning": "6kb",
+                                    "maximumError": "10kb"
                                 }
                             ]
                         },
index bb99e9b..6574349 100644 (file)
   "private": true,
   "dependencies": {
     "@akveo/ng2-completer": "^9.0.1",
-    "@angular/animations": "^14.2.12",
-    "@angular/cdk": "^13.3.9",
-    "@angular/common": "^14.2.12",
-    "@angular/compiler": "^14.2.12",
-    "@angular/core": "^14.2.12",
+    "@angular/animations": "^15.2.10",
+    "@angular/cdk": "^15.2.9",
+    "@angular/common": "^15.2.10",
+    "@angular/compiler": "^15.2.10",
+    "@angular/core": "^15.2.10",
     "@angular/flex-layout": "^9.0.0-beta.29",
-    "@angular/forms": "^14.2.12",
-    "@angular/localize": "^14.2.12",
-    "@angular/platform-browser": "^14.2.12",
-    "@angular/platform-browser-dynamic": "^14.2.12",
-    "@angular/router": "^14.2.12",
+    "@angular/forms": "^15.2.10",
+    "@angular/localize": "^15.2.10",
+    "@angular/platform-browser": "^15.2.10",
+    "@angular/platform-browser-dynamic": "^15.2.10",
+    "@angular/router": "^15.2.10",
     "@ctrl/ngx-codemirror": "^5.1.1",
     "@fortawesome/fontawesome-free": "^5.13.0",
     "@ng-bootstrap/ng-bootstrap": "^11.0.1",
-    "@ng-idle/core": "^11.0.3",
-    "@ng-idle/keepalive": "^11.0.3",
-    "@ng-select/ng-select": "^8.0.0",
-    "@ngx-translate/core": "^13.0.0",
-    "@ngx-translate/http-loader": "^4.0.0",
+    "@ng-idle/core": "^12.0.4",
+    "@ng-idle/keepalive": "^12.0.4",
+    "@ng-select/ng-select": "^10.0.3",
+    "@ngx-translate/core": "^14.0.0",
+    "@ngx-translate/http-loader": "^7.0.0",
     "@nomadreservations/ngx-codemirror": "^2.0.0",
     "@types/d3": "^5.7.2",
     "@types/js-yaml": "^3.12.1",
     "@types/jsonpath": "^0.2.0",
     "@types/ol": "^5.3.5",
-    "angular-notifier": "^9.1.0",
-    "bootstrap": "^4.6.2",
+    "angular-notifier": "^12.0.0",
+    "bootstrap": "^5.2.3",
     "chart.js": "^3.9.1",
     "chartjs-plugin-datalabels": "^2.2.0",
     "codemirror": "^5.51.0",
@@ -50,7 +50,7 @@
     "http-status-codes": "^1.3.2",
     "js-untar": "^2.0.0",
     "js-yaml": "^3.13.1",
-    "jsonpath": "^1.0.2",
+    "jsonpath": "^1.1.1",
     "ng-sidebar": "~9.2.0",
     "ng2-charts": "^3.0.0-rc.7",
     "ng2-file-upload": "^1.3.0",
     "rxjs": "^6.5.4",
     "rxjs-compat": "^6.5.5",
     "stream": "0.0.2",
-    "tslib": "^2.5.0",
-    "util": "^0.12.4",
-    "zone.js": "~0.11.8",
-    "@popperjs/core": "~2.10.1",
-    "ngx-toastr": "^13.2.1"
+    "ts-evaluator": "^1.2.0",
+    "tslib": "^2.6.0",
+    "util": "^0.12.5",
+    "zone.js": "~0.13.3",
+    "@popperjs/core": "^2.11.6",
+    "ngx-toastr": "^16.0.0"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "^14.2.10",
+    "@angular-devkit/build-angular": "^15.2.10",
     "@angular-eslint/builder": "13.5.0",
     "@angular-eslint/eslint-plugin": "13.5.0",
     "@angular-eslint/eslint-plugin-template": "13.5.0",
     "@angular-eslint/schematics": "13.5.0",
     "@angular-eslint/template-parser": "13.5.0",
-    "@angular/cli": "^14.2.10",
-    "@angular/compiler-cli": "^14.2.12",
-    "@angular/language-service": "^14.2.12",
+    "@angular/cli": "^15.2.10",
+    "@angular/compiler-cli": "^15.2.10",
+    "@angular/language-service": "^15.2.10",
     "@cypress/schematic": "^2.3.0",
     "@microsoft/eslint-plugin-sdl": "~0.2.0",
     "@types/jasmine": "~3.10.0",
     "@types/jasminewd2": "~2.0.3",
     "@types/jquery": "^3.3.31",
-    "@types/node": "^8.10.59",
+    "@types/node": "^12.11.1",
     "@typescript-eslint/eslint-plugin": "4.28.2",
     "@typescript-eslint/parser": "4.28.2",
     "cypress": "^12.10.0",
     "eslint-plugin-security": "~1.5.0",
     "jasmine-core": "~4.0.0",
     "jasmine-spec-reporter": "~5.0.0",
-    "karma": "~6.3.0",
+    "karma": "~6.4.2",
     "karma-chrome-launcher": "~3.1.0",
     "karma-coverage": "~2.1.0",
     "karma-jasmine": "~4.0.0",
     "karma-jasmine-html-reporter": "~1.7.0",
     "ng2-completer": "^3.0.3",
     "sass": "^1.58.0",
-    "ts-node": "~7.0.0",
-    "typescript": "~4.6.2"
+    "ts-node": "~8.3.0",
+    "typescript": "^4.9.3"
   }
 }
index 1c5886a..26d7aab 100644 (file)
 /**
  * @file App Components
  */
-import { isNullOrUndefined } from 'util';
 import { Component, HostListener, Injector } from '@angular/core';
 import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
 import { DEFAULT_INTERRUPTSOURCES, Idle } from '@ng-idle/core';
 import { AuthenticationService } from 'AuthenticationService';
 import { DeviceCheckService } from 'DeviceCheckService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 
 /**
  * Creating component
index 889f4be..bdf27fc 100644 (file)
@@ -45,6 +45,7 @@ import { DeleteComponent } from 'DeleteComponent';
 import { DeviceCheckService } from 'DeviceCheckService';
 import { GoToTopDirective } from 'GoToTopDirective';
 import { HeaderComponent } from 'HeaderComponent';
+import { HealingComponent } from 'HealingComponent';
 import { InstantiateNetSliceTemplateComponent } from 'InstantiateNetSliceTemplate';
 import { InstantiateNsComponent } from 'InstantiateNs';
 import { LayoutComponent } from 'LayoutComponent';
@@ -134,7 +135,8 @@ const customNotifierOptions: NotifierOptions = {
         NsUpdateComponent,
         WarningComponent,
         StartStopRebuildComponent,
-        VerticalScalingComponent
+        VerticalScalingComponent,
+        HealingComponent
     ],
     imports: [
         NotifierModule.withConfig(customNotifierOptions),
@@ -156,7 +158,7 @@ const customNotifierOptions: NotifierOptions = {
         }),
         NgbModule,
         NgSelectModule,
-        RouterModule.forRoot(appRoutes, { useHash: false, relativeLinkResolution: 'legacy' }),
+        RouterModule.forRoot(appRoutes, { useHash: false }),
         NgIdleKeepaliveModule.forRoot(),
         LoaderModule,
         SharedModule,
index 9689e03..d7dabe3 100644 (file)
@@ -66,7 +66,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             </div>
         </div>
         <div class="row module-counts">
-            <div class="col-xs-4 col-sm-4 col-md-4 col-lg-4 col-xl-4 p-0">
+            <div class="col-xs-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
                 <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12 mb-3">
                     <div class="status-card custom-card card-hover card aqua-card" routerLink="/packages/ns">
                         <i class="fas fa-box-open"></i>
@@ -88,7 +88,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     </div>
                 </div>
             </div>
-            <div class="col-xs-4 col-sm-4 col-md-4 col-lg-4 col-xl-4 p-0">
+            <div class="col-xs-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
                 <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12 mb-3">
                     <div class="status-card custom-card card-hover card purple-card" routerLink="/packages/vnf">
                         <i class="fas fa-box-open"></i>
@@ -110,7 +110,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     </div>
                 </div>
             </div>
-            <div class="col-xs-4 col-sm-4 col-md-4 col-lg-4 col-xl-4 p-0">
+            <div class="col-xs-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
                 <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12 mb-3">
                     <div class="status-card custom-card card-hover card pink-card" routerLink="/vim/details">
                         <i class="fas fa-server"></i>
@@ -135,20 +135,20 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
         <div class="row mb-2">
             <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
-                <div class="custom-card card mt-2 text-primary">
+                <div class="custom-card card mt-2 text-primary pb-3">
                     <div class="text-center header-style pt-2">{{'PAGE.VIMDETAILS.VIMRESOURCES' | translate}}</div>
                     <div class="row p-2">
                         <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
                             <div class="form-row">
                                 <div class="form-group col-md-6">
                                     <label for="vimType">{{'PAGE.VIMDETAILS.VIMTYPE' | translate}}</label>
-                                    <ng-select (change)="getSelectedVimTypeList($event.value)" [clearable]="false"
+                                    <ng-select (change)="getSelectedVimTypeList($event.value)" class="mt-2 vimdetails" [clearable]="false"
                                         placeholder="{{'SELECT' | translate}}" [items]="vimTypes" bindLabel="title"
                                         bindValue="value" id="vimType"></ng-select>
                                 </div>
-                                <div class="form-group col-md-6">
+                                <div class="form-group col-md-6 me-0">
                                     <label for="vimList">{{'PAGE.VIMDETAILS.NAME' | translate}}</label>
-                                    <ng-select (change)="getSelectedVIMDetails($event)" [clearable]="false"
+                                    <ng-select (change)="getSelectedVIMDetails($event)" class="mt-2 vimdetails" [clearable]="false"
                                         placeholder="{{'SELECT' | translate}}" [items]="vimList" bindLabel="name"
                                         bindValue="name" id="vimList" [(ngModel)]="vimListData"></ng-select>
                                 </div>
index df3c6b1..4f14da5 100644 (file)
@@ -20,6 +20,7 @@
  $min-height-set: 200px;
  .dashboard {
    .custom-card {
+     background-color: $white;
      word-wrap: break-word;
      @include box-shadow(0px, 1px, 15px, 0px, rgba(69, 90, 100, 0.1));
      @include transition(all, 0.2s, null, null);
@@ -37,7 +38,7 @@
      }
      &.pink-card {
        @include background(
-         linear-gradient(to left top, #d81b60, #e0306d, #e7407a, #ee4f87, #f55c94),
+         linear-gradient(to left top,#d81b60,#e0306d,#e7407a,#ee4f87,#f55c94),
          null,
          null,
          null,
@@ -46,7 +47,7 @@
      }
      &.purple-card {
        @include background(
-         linear-gradient(to left top, #605ca8, #736ebb, #8681ce, #9994e2, #aca7f6),
+         linear-gradient(to left top,#605ca8,#736ebb,#8681ce,#9994e2,#aca7f6),
          null,
          null,
          null,
@@ -55,7 +56,7 @@
      }
      &.aqua-card {
        @include background(
-         linear-gradient(to left top, #00c0ef, #00cdf5, #00dafa, #00e6fd, #0af3ff),
+         linear-gradient(to left top,#00c0ef,#00cdf5,#00dafa,#00e6fd,#0af3ff),
          null,
          null,
          null,
@@ -63,6 +64,7 @@
        );
      }
      .custom-card-header {
+       padding: 12px 20px 12px 20px;
        @include background(null, $primary, null, null, null);
        @include roundedTop(5);
        a {
@@ -77,6 +79,7 @@
          overflow-y: scroll;
          .list-group {
            .list-group-item {
+             background-color: $white;
              cursor: default;
              @include border(all, 0, solid, $black-coral);
              @include border(bottom, 1, solid, rgba(0, 0, 0, 0.125));
          &.show-canvas {
            @include flexbox(block !important, null, null, null, null, null);
          }
-         #canvas{
-          @include wh-value(100%, $min-height-set);
-        }
+         #canvas {
+           @include wh-value(100%, $min-height-set);
+         }
        }
      }
    }
        }
      }
    }
+   .font-weight-bold {
+     border-radius: 10px;
+   }
+   .form-row {
+     display: flex;
+     flex-wrap: wrap;
+     .form-group {
+       flex: 0 0 auto;
+       width: 47%;
+       margin-right: 25px;
+     }
+   }
+   .vimdetails {
+     width: 100%;
+   }
  }
\ No newline at end of file
index d49f708..8112c06 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Dashboard Component
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, OnInit } from '@angular/core';
 import { TranslateService } from '@ngx-translate/core';
 import { NotifierService } from 'angular-notifier';
@@ -35,7 +34,7 @@ import { ProjectService } from 'ProjectService';
 import { RestService } from 'RestService';
 import { Observable, Subscription } from 'rxjs';
 import { SDNControllerModel } from 'SDNControllerModel';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { ProjectRoleMappings, UserDetail } from 'UserModel';
 import { VimAccountDetails } from 'VimAccountModel';
 import { VNFInstanceDetails } from 'VNFInstanceModel';
index e8b3c0c..90342fd 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'PAGE.DASHBOARD.NETSLICEINSTANCE' | translate}}</div>
     <span class="button">
         <button class="btn btn-primary" type="button" placement="top" container="body"
@@ -25,8 +25,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </button>
     </span>
 </div>
-<div class="row mt-2 mb-0 list-utilites-actions">
-    <div class="col-auto mr-auto">
+<div class="mt-2 mb-2 list-utilites-actions">
+    <div class="col-auto me-auto">
         <nav class="custom-items-config">
             <span><i class="fas fa-clock text-warning"></i>{{operationalStateFirstStep}}</span>
             <span><i class="fas fa-check-circle text-success"></i>{{operationalStateSecondStep}} /
@@ -34,7 +34,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <span><i class="fas fa-times-circle text-danger"></i>{{operationalStateThirdStep}}</span>
         </nav>
     </div>
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index 7890a13..aabdd78 100644 (file)
@@ -15,18 +15,18 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'HISTORYOFOPERATIONS' | translate}}</div>
 </div>
-<div class="row mt-2 mb-0 list-utilites-actions">
-    <div class="col-auto mr-auto">
+<div class="mt-2 mb-2 list-utilites-actions">
+    <div class="col-auto me-auto">
         <nav class="custom-items-config">
             <span><i class="fas fa-clock text-warning"></i>{{historyStateFirstStep}}</span>
             <span><i class="fas fa-check-circle text-success"></i>{{historyStateSecondStep}}</span>
             <span><i class="fas fa-times-circle text-danger"></i>{{historyStateThirdStep}}</span>
         </nav>
     </div>
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index afbefdb..da3ff10 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file NS History Of Operations Component
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, OnInit } from '@angular/core';
 import { ActivatedRoute } from '@angular/router';
 import { Router } from '@angular/router';
@@ -32,7 +31,7 @@ import { LocalDataSource } from 'ng2-smart-table';
 import { NSDInstanceData } from 'NSInstanceModel';
 import { RestService } from 'RestService';
 import { Subscription } from 'rxjs';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { ShowInfoComponent } from 'ShowInfoComponent';
 
 /**
index 523ee44..8ee93b8 100644 (file)
@@ -15,30 +15,32 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'NSINSTANCES' | translate}}</div>
     <span class="button">
-        <button class="btn btn-primary" type="button" placement="top" container="body" ngbTooltip="{{'PAGE.NSINSTANCE.NEWNSINSTANCE' | translate}}"
+        <button class="btn btn-primary me-2" type="button" placement="top" container="body" ngbTooltip="{{'PAGE.NSINSTANCE.NEWNSINSTANCE' | translate}}"
             (click)="instantiateNS()">
             <i class="fa fa-paper-plane" aria-hidden="true"></i>&nbsp; {{'PAGE.NSINSTANCE.NEWNSINSTANCE' | translate}}
         </button>
     </span>
 </div>
-<div class="row mt-2 mb-0 list-utilites-actions">
-    <div class="col-auto mr-auto">
+<div class="mt-2 mb-2 list-utilites-actions">
+    <div class="col-auto me-auto">
         <nav class="custom-items-config">
             <span><i class="fas fa-clock text-warning"></i>{{operationalStateFirstStep}}</span>
             <span><i class="fas fa-check-circle text-success"></i>{{operationalStateSecondStep}} /
                 {{configStateSecondStep}}</span>
             <span><i class="fas fa-times-circle text-danger"></i>{{operationalStateThirdStep}}</span>
             <span><i class="fas fa-compress-alt text-success"></i>{{operationalStateFourthStep}}</span>
+            <span><i class="fas fa-briefcase-medical text-success"></i>{{operationalStateFifthStep}}</span>
         </nav>
     </div>
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
-    <ng2-smart-table [ngClass]="checkDataClass" [settings]="settings" [source]="dataSource" (userRowSelect)="onUserRowSelect($event)">
+    <ng2-smart-table [ngClass]="checkDataClass" [settings]="settings" [source]="dataSource"
+        (userRowSelect)="onUserRowSelect($event)">
     </ng2-smart-table>
 </div>
 <app-loader [waitingMessage]="message" *ngIf="isLoadingResults"></app-loader>
\ No newline at end of file
index e7de4a7..14d6349 100644 (file)
@@ -84,6 +84,9 @@ export class NSInstancesComponent implements OnInit {
     /** operational State scaling data @public */
     public operationalStateFourthStep: string = CONFIGCONSTANT.operationalStateFourthStep;
 
+    /** operational State healing data @public */
+    public operationalStateFifthStep: string = CONFIGCONSTANT.operationalStateFifthStep;
+
     /** Config State init data @public */
     public configStateFirstStep: string = CONFIGCONSTANT.configStateFirstStep;
 
@@ -161,27 +164,33 @@ export class NSInstancesComponent implements OnInit {
                             { value: this.operationalStateFirstStep, title: this.operationalStateFirstStep },
                             { value: this.operationalStateSecondStep, title: this.operationalStateSecondStep },
                             { value: this.operationalStateThirdStep, title: this.operationalStateThirdStep },
-                            { value: this.operationalStateFourthStep, title: this.operationalStateFourthStep }
+                            { value: this.operationalStateFourthStep, title: this.operationalStateFourthStep },
+                            { value: this.operationalStateFifthStep, title: this.operationalStateFifthStep }
                         ]
                     }
                 },
                 valuePrepareFunction: (cell: NSDInstanceData, row: NSDInstanceData): string => {
                     if (row.OperationalStatus === this.operationalStateFirstStep) {
                         return `<span class="icon-label" title="${row.OperationalStatus}">
-                        <i class="fas fa-clock text-warning"></i>
-                        </span>`;
+                         <i class="fas fa-clock text-warning"></i>
+                         </span>`;
                     } else if (row.OperationalStatus === this.operationalStateSecondStep) {
                         return `<span class="icon-label" title="${row.OperationalStatus}">
-                        <i class="fas fa-check-circle text-success"></i>
-                        </span>`;
+                         <i class="fas fa-check-circle text-success"></i>
+                         </span>`;
                     } else if (row.OperationalStatus === this.operationalStateThirdStep) {
                         return `<span class="icon-label" title="${row.OperationalStatus}">
-                        <i class="fas fa-times-circle text-danger"></i>
-                        </span>`;
+                         <i class="fas fa-times-circle text-danger"></i>
+                         </span>`;
                     } else if (row.OperationalStatus === this.operationalStateFourthStep) {
                         return `<span class="icon-label" title="${row.OperationalStatus}">
-                        <i class="fas fa-compress-alt text-success"></i>
-                        </span>`;
+                         <i class="fas fa-compress-alt text-success"></i>
+                         </span>`;
+                    }
+                    else if (row.OperationalStatus === this.operationalStateFifthStep) {
+                        return `<span class="icon-label" title="${row.OperationalStatus}">
+                         <i class="fas fa-briefcase-medical text-success"></i>
+                         </span>`;
                     } else {
                         return `<span>${row.OperationalStatus}</span>`;
                     }
@@ -203,16 +212,16 @@ export class NSInstancesComponent implements OnInit {
                 valuePrepareFunction: (cell: NSDInstanceData, row: NSDInstanceData): string => {
                     if (row.ConfigStatus === this.configStateFirstStep) {
                         return `<span class="icon-label" title="${row.ConfigStatus}">
-                        <i class="fas fa-clock text-warning"></i>
-                        </span>`;
+                         <i class="fas fa-clock text-warning"></i>
+                         </span>`;
                     } else if (row.ConfigStatus === this.configStateSecondStep) {
                         return `<span class="icon-label" title="${row.ConfigStatus}">
-                        <i class="fas fa-check-circle text-success"></i>
-                        </span>`;
+                         <i class="fas fa-check-circle text-success"></i>
+                         </span>`;
                     } else if (row.ConfigStatus === this.configStateThirdStep) {
                         return `<span class="icon-label" title="${row.ConfigStatus}">
-                        <i class="fas fa-times-circle text-danger"></i>
-                        </span>`;
+                         <i class="fas fa-times-circle text-danger"></i>
+                         </span>`;
                     } else {
                         return `<span>${row.ConfigStatus}</span>`;
                     }
index 34b8a0e..f5344ff 100644 (file)
@@ -23,33 +23,33 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
 </div>
 <form [formGroup]="primitiveForm" (ngSubmit)="execPrimitive()">
     <div class="modal-body">
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label">{{'PRIMITIVETYPE' | translate}}*</label>
             <div class="col-sm-8">
                 <ng-select (change)="primitiveTypeChange($event)" [clearable]="false" placeholder="{{'SELECT' | translate}}" [items]="primitiveTypeList" bindLabel="title" bindValue="value" [(ngModel)]="primitiveType" id="primitiveType" [ngModelOptions]="{standalone: true}"
                     [ngClass]="{ 'is-invalid': submitted && !primitiveType }"></ng-select>
             </div>
         </div>
-        <div class="form-group row" *ngIf="primitiveType === 'VNF_Primitive' || primitiveType === 'VDU_Primitive' || primitiveType === 'KDU_Primitive'">
+        <div class="form-group row mb-3" *ngIf="primitiveType === 'VNF_Primitive' || primitiveType === 'VDU_Primitive' || primitiveType === 'KDU_Primitive'">
             <label class="col-sm-4 col-form-label">VNF Profile ID *</label>
             <div class="col-sm-3">
                 <ng-select (change)="indexChange($event, primitiveType)" [clearable]="false" placeholder="{{'SELECT' | translate}}" [items]="memberTypes" bindLabel="id" bindValue="id" formControlName="member_vnf_index" id="member_vnf_index"
                     [ngClass]="{ 'is-invalid': submitted && f.member_vnf_index.errors }"></ng-select>
             </div>
         </div>
-        <div class="form-group row" *ngIf="primitiveType === 'VDU_Primitive'">
+        <div class="form-group row mb-3" *ngIf="primitiveType === 'VDU_Primitive'">
             <label class="col-sm-4 col-form-label">{{'SELECT' | translate}} VDU *</label>
             <div class="col-sm-8">
                 <ng-select (change)="getPrimitiveList($event, 'vdu')" [clearable]="false" placeholder="{{'SELECT' | translate}}" [items]="vduList" bindLabel="name" bindValue="id" formControlName="vdu_id" id="vdu_id" [ngClass]="{ 'is-invalid': submitted && f.vdu_id.errors }"></ng-select>
             </div>
         </div>
-        <div class="form-group row" *ngIf="primitiveType === 'KDU_Primitive'">
+        <div class="form-group row mb-3" *ngIf="primitiveType === 'KDU_Primitive'">
             <label class="col-sm-4 col-form-label">{{'SELECT' | translate}} KDU *</label>
             <div class="col-sm-8">
                 <ng-select (change)="getPrimitiveList($event, 'kdu')" [clearable]="false" placeholder="{{'SELECT' | translate}}" [items]="kduList" bindLabel="name" bindValue="name" formControlName="kdu_name" id="kdu_name" [ngClass]="{ 'is-invalid': submitted && f.kdu_name.errors }"></ng-select>
             </div>
         </div>
-        <div class="form-group row" *ngIf="primitiveType">
+        <div class="form-group row mb-3" *ngIf="primitiveType">
             <label class="col-sm-4 col-form-label">
                 {{'PAGE.NSPRIMITIVE.PRIMITIVE' | translate}}*</label>
             <div class="col-sm-8">
@@ -65,7 +65,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </div>
             </div>
             <div formArrayName="primitive_params" *ngFor="let params of getControls(); let i = index;">
-                <div class="form-group row" [formGroupName]="i">
+                <div class="form-group row mb-3" [formGroupName]="i">
                     <label class="col-sm-2 col-form-label">{{'NAME' | translate}}:</label>
                     <div class="col-sm-3">
                         <ng-select placeholder="{{'SELECT' | translate}}" [clearable]="false" [items]="primitiveParameter" bindLabel="name" bindValue="name" formControlName="primitive_params_name" id="parameter{{i}}" [ngClass]="{ 'is-invalid': submitted && params.controls.primitive_params_name.errors }">
index 8f39a20..cf60b57 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file NS Instance Primitive Component
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
@@ -30,7 +29,7 @@ import { environment } from 'environment';
 import { KDUPRIMITIVELEVEL, NSData, VDUPRIMITIVELEVEL, VNFPROFILE } from 'NSDModel';
 import { NSPrimitiveParams } from 'NSInstanceModel';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { CONFIGPRIMITIVE, DF, VDUCONFIG, VDUPROFILE, VNFCONFIG, VNFD } from 'VNFDModel';
 import { VNFInstanceDetails } from 'VNFInstanceModel';
 
index 084f90e..108a4ed 100644 (file)
@@ -26,7 +26,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         <div class="sidebar-body">
             <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 mb-2" *ngIf="isShowNSDetails && nsInfo">
                 <div class="row">
-                    <div class="col-12 p-0">
+                    <div class="col-12">
                         <table class="table table-bordered text-dark custom-table">
                             <tr>
                                 <td>{{'NS' | translate}} {{'INSTANCE' | translate}} Id</td>
@@ -137,7 +137,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     <div class="row ns-instance-form justify-content-end ">
         <div class="col-xs-9 col-sm-9 col-md-9 col-lg-9">
             <div class="row">
-                <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 pl-0">
+                <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 ps-0">
                     <div class="btn-group list" role="group" aria-label="Basic example">
                         <button type="button" class="btn btn-primary topology-btn" (click)="onFreeze()"
                             [class.pinned]="classApplied" placement="top" container="body"
@@ -146,7 +146,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                         </button>
                     </div>
                 </div>
-                <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 text-right pr-0 badgegroup">
+                <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 text-end pe-0 badgegroup">
                     <span class="badge badge-primary badge-pill bg-white text-body font-weight-bold">
                         <img src="assets/images/VNFD.svg" class="ns-svg" draggable="false"/>
                         <br>VNFR</span>
index 8981e26..57e9ca2 100644 (file)
@@ -30,8 +30,8 @@ import * as HttpStatus from 'http-status-codes';
 import { CCI, DF, VLC, VNFPROFILE } from 'NSDModel';
 import { COMPOSERNODES, CONNECTIONPOINT, NSD, NSDVLD, NSINFO, NSInstanceDetails, NSINSTANCENODES, VLINFO, VNFRINFO } from 'NSInstanceModel';
 import { GRAPHDETAILS, Tick, TickPath } from 'NSTopologyModel';
-import { RestService } from 'src/services/RestService';
-import { isNullOrUndefined } from 'util';
+import { RestService } from 'RestService';
+import { isNullOrUndefined } from 'SharedService';
 
 /**
  * Creating component
index 3c18bfa..8e7ac45 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'PDUINSTANCES' | translate}}</div>
     <span class="button">
         <button class="btn btn-primary" type="button" placement="top" container="body"
@@ -25,8 +25,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </button>
     </span>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+<div class="mt-2 mb-2 form-group justify-content-end list-utilites-actions">
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index 54e36fa..1a9a0a7 100644 (file)
@@ -22,8 +22,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </button>
 </div>
 <form [formGroup]="pduInstancesForm" (ngSubmit)="createPDUInstances()" autocomplete="off">
-    <div class="modal-body">
-        <div class="form-group row">
+    <div class="modal-body pb-0">
+        <div class="form-group row mb-3">
             <label class="col-sm-12 col-form-label mandatory-label" [ngClass]="{'text-danger': pduInstancesForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
             <label class="col-sm-3 col-form-label" for="name">{{'NAME' | translate}}*</label>
             <div class="col-sm-3">
@@ -35,7 +35,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 <input placeholder="{{'PAGE.PDUINSTANCE.PDUTYPE' | translate}}" type="text" class="form-control" formControlName="type" id="type" [ngClass]="{ 'is-invalid': submitted && f.type.errors }">
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-3 col-form-label" for="vim_accounts">{{'VIMACCOUNTS' | translate}}*</label>
             <div class="col-sm-9">
                 <ng-select placeholder="{{'VIMACCOUNTS' | translate}}" [items]="vimAccountSelect" multiple="true" bindLabel="name" bindValue="_id" formControlName="vim_accounts" id="vim_accounts"
@@ -43,7 +43,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </ng-select>
             </div>
         </div>
-        <div class="form-group row p-2 bg-light text-dark">
+        <div class="form-group row p-2 bg-light text-dark mb-3">
             <div class="col-sm-7 align-self-center"><span>{{'PAGE.PDUINSTANCE.PARAMETERS' | translate}}</span></div>
             <div class="col-sm-5">
                 <button type="button" class="btn btn-primary" (click)="createInterfaces()">
@@ -67,7 +67,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                                 </div>
                             </div>
                         </div>
-                        <div class="row mr-top-5">
+                        <div class="row me-top-5 mb-3">
                             <label class="col-sm-2 col-form-label" for="mgmt{{i}}">{{'MGMT' | translate}}*</label>
                             <div class="col-sm-4">
                                 <ng-select placeholder="{{'SELECT' | translate}} {{'MGMT' | translate}}" [items]="mgmtState" bindLabel="name" bindValue="value" formControlName="mgmt" id="mgmt{{i}}" [ngClass]="{ 'is-invalid': submitted && params.controls.mgmt.errors }"></ng-select>
@@ -87,7 +87,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             </div>
         </div>
     </div>
-    <div class="modal-footer">
+    <div class="modal-footer mt-3">
         <button type="button" class="btn btn-danger" (click)="activeModal.close()">{{'CANCEL' | translate}}</button>
         <button type="submit" class="btn btn-primary">{{'CREATE' | translate}}</button>
     </div>
index e36cc3d..609af69 100644 (file)
@@ -15,11 +15,11 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'VNFINSTANCES' | translate}}</div>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+<div class="mt-2 mb-2 form-group justify-content-end list-utilites-actions">
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index f06d098..707d8d6 100644 (file)
@@ -23,7 +23,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </button>
   </div>
   <div class="modal-body modal-body-custom-height">
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-12 col-form-label mandatory-label"
         [ngClass]="{'text-danger': k8sclusterForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
       <label class="col-sm-4 col-form-label" for="name">{{'PAGE.K8S.NAME' | translate}}*</label>
@@ -32,7 +32,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           formControlName="name" id="name" [ngClass]="{ 'is-invalid': submitted && f.name.errors }" required>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="k8s_version">{{'PAGE.K8S.K8SVERSION' | translate}}*</label>
       <div class="col-sm-8">
         <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.K8SVERSION' | translate}}" type="text"
@@ -40,7 +40,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           required>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="vim_account">{{'PAGE.K8S.VIMACCOUNT' | translate}}*</label>
       <div class="col-sm-8">
         <ng-select placeholder="{{'SELECT' | translate}} {{'PAGE.K8S.VIMACCOUNT' | translate}}"
@@ -49,7 +49,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </ng-select>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="deployment_methods">{{'PAGE.K8S.DEPLOYMENTMETHODS' | translate}}*</label>
       <div class="col-sm-8">
         <ng-select placeholder="{{'SELECT' | translate}} {{'PAGE.K8S.DEPLOYMENTMETHODS' | translate}}"
@@ -61,7 +61,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </ng-select>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="description">{{'PAGE.K8S.DESCRIPTION' | translate}}*</label>
       <div class="col-sm-8">
         <textarea class="form-control" placeholder="{{'PAGE.K8S.DESCRIPTION' | translate}}" type="text"
@@ -69,29 +69,27 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           required></textarea>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="nets">{{'PAGE.K8S.NETS' | translate}}*</label>
       <div class="col-sm-8">
         <textarea rows="5" cols="50" class="form-control" placeholder="{{'PAGE.K8S.NETSPLACEHOLDER' | translate}}"
           formControlName="nets" id="nets" [ngClass]="{ 'is-invalid': submitted && f.nets.errors }" required></textarea>
         <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
         <div class="custom-file">
-          <input type="file" #fileInputNets class="custom-file-input" (change)="netsFile($event.target.files)"
+          <input type="file" #fileInputNets class="fileupload custom-file-input" (change)="netsFile($event.target.files)"
             id="customFileNets">
-          <label class="custom-file-label" #fileInputNetsLabel for="customFileNets">{{'CHOOSEFILE' | translate}}</label>
         </div>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="credentials">{{'PAGE.K8S.CREDENTIALS' | translate}}*</label>
       <div class="col-sm-8">
         <textarea rows="5" cols="50" class="form-control" placeholder="{{'YAMLCONFIG' | translate}}" formControlName="credentials"
           id="credentials" [ngClass]="{ 'is-invalid': submitted && f.credentials.errors }" required></textarea>
         <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
         <div class="custom-file">
-          <input type="file" #fileInputCredentials class="custom-file-input" (change)="credentialsFile($event.target.files)"
+          <input type="file" #fileInputCredentials class="fileupload custom-file-input" (change)="credentialsFile($event.target.files)"
             id="customFileCredentials">
-          <label class="custom-file-label" #fileInputCredentialsLabel for="customFileCredentials">{{'CHOOSEFILE' | translate}}</label>
         </div>
       </div>
     </div>
index 4eb70f7..8115b6f 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file K8sAddClusterComponent.ts.
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, ElementRef, Injector, OnInit, ViewChild } from '@angular/core';
 import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -29,7 +28,7 @@ import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, TYPESECTION } from 'Co
 import { environment } from 'environment';
 import * as jsyaml from 'js-yaml';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { VimAccountDetails } from 'VimAccountModel';
 /**
  * Creating Component
index 8caec5e..d2c68e8 100644 (file)
@@ -23,7 +23,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </button>
   </div>
   <div class="modal-body k8saddrepo">
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-12 col-form-label mandatory-label"
         [ngClass]="{'text-danger': k8srepoForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
       <label class="col-sm-4 col-form-label" for="name">{{'PAGE.K8S.NAME' | translate}}*</label>
@@ -32,7 +32,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           formControlName="name" id="name" [ngClass]="{ 'is-invalid': submitted && f.name.errors }" required>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="type">{{'PAGE.K8S.TYPE' | translate}}*</label>
       <div class="col-sm-8">
         <ng-select [items]="repoTypeSelect" bindLabel="name" bindValue="id"
@@ -41,7 +41,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </ng-select>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="url">{{'PAGE.K8S.URL' | translate}}*</label>
       <div class="col-sm-8">
         <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.URL' | translate}}" type="url"
@@ -51,7 +51,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="description">{{'PAGE.K8S.DESCRIPTION' | translate}}*</label>
       <div class="col-sm-8">
         <textarea class="form-control" placeholder="{{'PAGE.K8S.DESCRIPTION' | translate}}" type="text"
index ebed3e4..613e6aa 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
   <div class="d-flex align-items-center header-style">{{'PAGE.K8S.REGISTERK8CLUSTER' | translate}}</div>
   <span class="button">
     <button class="btn btn-primary" type="button" placement="top" container="body" ngbTooltip="{{'PAGE.K8S.ADDK8CLUSTER' | translate}}"
@@ -24,15 +24,15 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </button>
   </span>
 </div>
-<div class="row mt-2 mb-0 list-utilites-actions">
-  <div class="col-auto mr-auto">
+<div class="mt-2 mb-2 list-utilites-actions">
+  <div class="col-auto me-auto">
     <nav class="custom-items-config">
       <span><i class="fas fa-clock text-warning"></i>{{operationalStateFirstStep}}</span>
       <span><i class="fas fa-check-circle text-success"></i>{{operationalStateSecondStep}}</span>
       <span><i class="fas fa-times-circle text-danger"></i>{{operationalStateThirdStep}}</span>
     </nav>
   </div>
-  <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+  <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
   <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index e546356..16c9a37 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
   <div class="d-flex align-items-center header-style">{{'PAGE.K8S.REGISTERK8REPO' | translate}}</div>
   <span class="button">
     <button class="btn btn-primary" type="button" placement="top" container="body" ngbTooltip="{{'PAGE.K8S.ADDK8REPO' | translate}}"
@@ -24,8 +24,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </button>
   </span>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-  <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+<div class="mt-2 mb-2 form-group justify-content-end list-utilites-actions">
+  <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
   <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index 96f1302..4413953 100644 (file)
@@ -19,7 +19,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
 <div id="main-wrapper" class="container-fluid" dir="ltr" appGottoTop>
     <div class="layout-wrapper mt-2">
         <app-sidebar></app-sidebar>
-        <div class="content-section pl-4">
+        <div class="content-section ps-4">
             <app-breadcrumb></app-breadcrumb>
             <div class="mt-2">
                 <div class="card custom-card shadow">
index 9d028b3..0bd8d2a 100644 (file)
@@ -16,7 +16,7 @@ limitations under the License.
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
 <nav aria-label="breadcrumb" class="breadcrumb-holder">
-  <ul class="breadcrumb-custom pl-0">
+  <ul class="breadcrumb-custom ps-0">
     <li class="breadcrumb-item-custom" [routerLink]="item.url" *ngFor="let item of menuItems; let i = index" [class.active]="i===menuItems.length-1">
       <a *ngIf="i!==menuItems.length-1">
         <i *ngIf="i==0" class="fas fa-th-large"></i>&nbsp;&nbsp;{{item.title | translate}}
index 1effed8..9f43da0 100644 (file)
 /**
  * @file Bread Crumb component.
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, OnInit } from '@angular/core';
 import { Title } from '@angular/platform-browser';
 import { ActivatedRoute, NavigationEnd, Router, RouterEvent, UrlSegment } from '@angular/router';
 import { TranslateService } from '@ngx-translate/core';
 import { BREADCRUMBITEM } from 'CommonModel';
 import { filter, startWith } from 'rxjs/operators';
+import { isNullOrUndefined } from 'SharedService';
 
 /**
  * Creating component
index 042f720..9d217d8 100644 (file)
@@ -26,9 +26,9 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     <a class="navbar-brand">
         <img routerLink="/" src="assets/images/logo.png" class="osm-logo" alt="OPEN SOURCE MANO" draggable="false">
     </a>
-    <div class="nav navbar-nav nav-flex-icons ml-auto">
+    <div class="nav navbar-nav nav-flex-icons ms-auto">
         <h5>
-            <span class="badge badge-primary mt-2">{{'OSMVERSION' | translate}} {{sharedService.osmVersion}}</span>
+            <span class="badge bg-primary mt-2">{{'OSMVERSION' | translate}} {{sharedService.osmVersion}}</span>
         </h5>
         <ul class="navbar-nav cursor-pointer" ngbDropdown display="dynamic" placement="bottom-right">
             <li class="nav-item dropdown">
@@ -51,7 +51,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </div>
             </li>
         </ul>
-        <ul class="navbar-nav cursor-pointer text-right" ngbDropdown display="dynamic" placement="bottom-right">
+        <ul class="navbar-nav cursor-pointer text-end" ngbDropdown display="dynamic" placement="bottom-right">
             <li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle" id="navbarDropdown" ngbDropdownToggle>
                     <i class="fas fa-user-circle"></i> {{'USER' | translate}} ({{username$ | async}})
index 81f90c1..0a5027a 100644 (file)
 @import '../../../assets/scss/mixins/mixin';
 @import '../../../assets/scss/variable';
 
+.close {
+    opacity: 1;
+    background-color: transparent;
+    border: 0;
+    position: absolute;
+    right: 10px;
+    top: 2px;
+    font-size: 1.31rem;
+}
 .navbar{
     @include box-shadow(0px, 0px, 12px, 0px, rgba($black,0.14));
     @include border(all, 0, solid, $gray-80);
@@ -25,6 +34,7 @@
         cursor: pointer;
     }
     .custom-dropdown-menu {
+        background-color: white !important;
         .dropdown-item{
             &.project-item{
                 @include flexbox(flex, space-between, row, null, center, null);
index 13e2129..45807f9 100644 (file)
@@ -28,7 +28,7 @@ import { MODALCLOSERESPONSEDATA } from 'CommonModel';
 import { environment } from 'environment';
 import { ProjectService } from 'ProjectService';
 import { Observable } from 'rxjs';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { UserSettingsComponent } from 'UserSettingsComponent';
 
 /**
@@ -75,6 +75,9 @@ export class HeaderComponent implements OnInit {
     /** handle translate @public */
     public translateService: TranslateService;
 
+    /** Version holds version @public */
+    public getLocalStorageVersion: string;
+
     /** Utilizes auth service for any auth operations @private */
     private authService: AuthenticationService;
 
@@ -101,14 +104,19 @@ export class HeaderComponent implements OnInit {
         this.authService.ProjectName.subscribe((projectNameFinal: string): void => {
             this.getSelectedProject = projectNameFinal;
         });
+        this.sharedService.fetchOSMVersion();
         this.username$ = this.authService.username;
         this.projectService.setHeaderProjects();
         this.projectList$ = this.projectService.projectList;
         this.PACKAGEVERSION = environment.packageVersion;
-        const getLocalStorageVersion: string = sessionStorage.getItem('osmVersion');
-        if (getLocalStorageVersion === null) {
+        if (!isNullOrUndefined(sessionStorage.getItem('version'))) {
+            this.getLocalStorageVersion = sessionStorage.getItem('version');
+        } else if (!isNullOrUndefined(this.sharedService.osmVersion)) {
+            this.getLocalStorageVersion = this.sharedService.osmVersion;
+        }
+        if (this.getLocalStorageVersion === null) {
             this.showNewVersion();
-        } else if (getLocalStorageVersion !== this.sharedService.osmVersion) {
+        } else if (this.getLocalStorageVersion !== sessionStorage.getItem('osmVersion')) {
             this.showNewVersion();
         }
     }
index c328778..60ab756 100644 (file)
@@ -19,9 +19,9 @@
 /**
  * @file Sidebar Component
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, OnInit } from '@angular/core';
 import { DeviceCheckService } from 'DeviceCheckService';
+import { isNullOrUndefined } from 'SharedService';
 import { MENU_ITEMS, MENUITEMS } from 'src/models/MenuModel';
 
 /**
index 45573e2..92fe3c3 100644 (file)
@@ -19,7 +19,6 @@
 /**
  * @file Page for Login component
  */
-import { isNullOrUndefined } from 'util';
 import { HttpErrorResponse } from '@angular/common/http';
 import { Component, Injector, OnInit } from '@angular/core';
 import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -31,7 +30,7 @@ import { environment } from 'environment';
 import { ToastrService } from 'ngx-toastr';
 import { RestService } from 'RestService';
 import { Observable } from 'rxjs';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { UserDetail } from 'UserModel';
 
 /**
index e23f6a4..128bcb3 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{ 'PAGE.OPERATIONALDASHBOARD.TITLE' | translate }}
         ({{ 'PAGE.OPERATIONALDASHBOARD.MODELSUMMARY' | translate }})</div>
     <page-reload></page-reload>
@@ -40,12 +40,12 @@ Author: BARATH KUMAR R (barath.r@tataelxsi.co.in)
                     <div class="row">
                         <div class="col-lg-12 col-md-12 col-sm-12 p-1">
                             <div class="row my-2 justify-content-end align-items-center setting-section">
-                                <div class="form-group row align-items-center mb-0">
-                                    <label class="col-form-label font-weight-bold text-primary">
+                                <div class="form-group align-items-center mb-0 text-end p-0">
+                                    <label class="col-form-label fw-bold text-primary">
                                         {{ 'PAGE.OPERATIONALDASHBOARD.LIVELOAD' | translate}}
                                     </label>
                                     <!-- Live button switch -->
-                                    <label class="switch ml-1">
+                                    <label class="switch ms-1">
                                         <input id="liveData{{i}}" type="checkbox" [checked]="vcaDetail.isLiveloading"
                                             (change)="callLiveData($event.target.checked, vcaDetail.ns_id, i)">
                                         <div class="slider round">
@@ -54,7 +54,7 @@ Author: BARATH KUMAR R (barath.r@tataelxsi.co.in)
                                         </div>
                                     </label>
                                     <!-- Seconds button group -->
-                                    <div class="btn-group list action ml-2 seconds-btn-group" role="group"
+                                    <div class="btn-group list action ms-2 seconds-btn-group" role="group"
                                         *ngIf="vcaDetail.isLiveloading">
                                         <button [disabled]="!vcaDetail.isLiveloading" type="button"
                                             class="btn btn-primary"
@@ -67,7 +67,7 @@ Author: BARATH KUMAR R (barath.r@tataelxsi.co.in)
                         </div>
                     </div>
                     <ng-container *ngFor="let modelVCAStatus of vcaDetail.vcaStatusModels; let i = index;">
-                        <h5 class="font-weight-bold text-primary">
+                        <h5 class="fw-bold text-primary">
                             {{ 'PAGE.OPERATIONALDASHBOARD.MODEL' | translate }} {{i+1}} (Cloud/Region):
                             {{modelVCAStatus.model ? modelVCAStatus.model.cloud_tag : '-'}}/
                             {{modelVCAStatus.model ? modelVCAStatus.model.region : '-' }}
@@ -75,7 +75,7 @@ Author: BARATH KUMAR R (barath.r@tataelxsi.co.in)
                         <div class="row">
                             <div class="col-lg-12 col-md-12 col-sm-12 p-1">
                                 <div class="row my-2 justify-content-between align-items-center filter-actions">
-                                    <div class="form-group row align-items-center mb-0">
+                                    <div class="form-group align-items-center mb-0 p-0">
                                         <button class="btn btn-sm btn-outline-primary mx-1 filter{{i}} all{{i}} active"
                                             type="button" (click)="showHideTables($event.target, 'all', i)">
                                             {{ 'ALL' | translate }}
@@ -109,11 +109,11 @@ Author: BARATH KUMAR R (barath.r@tataelxsi.co.in)
                                     </div>
                                     <div class="form-group row align-items-center mb-0"
                                         *ngIf="modelVCAStatus.executedActions !== undefined && modelVCAStatus.executedActions.length > 0">
-                                        <label class="col-form-label font-weight-bold text-primary">
+                                        <label class="col-form-label fw-bold text-primary">
                                             {{ 'EXECUTEDACTIONS' | translate }}
                                         </label>
                                         <button type="button"
-                                            class="btn btn-sm btn-primary border border-radius-default ml-1"
+                                            class="btn btn-sm btn-primary border border-radius-default ms-1"
                                             (click)="showExecutedActionsList(modelVCAStatus.executedActions);">
                                             <i class="fas fa-directions"></i>
                                         </button>
index edb972a..0484de8 100644 (file)
@@ -20,7 +20,6 @@
 /**
  * @file Page for Operational View Component
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, OnInit } from '@angular/core';
 import { ActivatedRoute } from '@angular/router';
 import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
@@ -36,7 +35,7 @@ import { RestService } from 'RestService';
 import { Observable } from 'rxjs';
 import { Subscription } from 'rxjs';
 import { map } from 'rxjs/operators';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 /**
  * Creating component
  * @Component takes OperationalViewComponent.html as template url
index acee5ed..f622dbd 100644 (file)
 /**
  * @file Page for Operational View App actions Component
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import { URLPARAMS } from 'CommonModel';
+import { isNullOrUndefined } from 'SharedService';
 /**
  * Creating component
  * @Component takes OperationalViewAppActionsComponent.html as template url
index 4d40d2c..fafcc5f 100644 (file)
 /**
  * @file Page for Operational View App configs Component
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import { URLPARAMS } from 'CommonModel';
+import { isNullOrUndefined } from 'SharedService';
 /**
  * Creating component
  * @Component takes OperationalViewAppConfigsComponent.html as template url
index d761653..b589605 100644 (file)
 /**
  * @file Page for Operational View App Executed actions Component
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import { URLPARAMS } from 'CommonModel';
 import { EXECUTEDACTIONS } from 'OperationalModel';
+import { isNullOrUndefined } from 'SharedService';
 /**
  * Creating component
  * @Component takes OperationalViewAppExecutedActionsComponent.html as template url
index 38c753b..94adddf 100644 (file)
@@ -23,7 +23,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </button>
   </div>
   <div class="modal-body osmrepoadd">
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-12 col-form-label mandatory-label"
         [ngClass]="{'text-danger': osmrepoForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
       <label class="col-sm-4 col-form-label" for="name">{{'NAME' | translate}}*</label>
@@ -33,7 +33,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           maxlength="{{sharedService.MAX_LENGTH_NAME}}" required>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="type">{{'TYPE' | translate}}*</label>
       <div class="col-sm-8">
         <ng-select bindLabel="title" bindValue="value" [items]="osmrepoType"
@@ -42,7 +42,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </ng-select>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="url">{{'URL' | translate}}*</label>
       <div class="col-sm-8">
         <input autocomplete="off" class="form-control" placeholder="{{'URL' | translate}}" type="url"
@@ -52,7 +52,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="description">{{'DESCRIPTION' | translate}}*</label>
       <div class="col-sm-8">
         <textarea rows="5" cols="50" class="form-control" placeholder="{{'DESCRIPTION' | translate}}" type="text"
index 29cdbaa..5de280d 100644 (file)
@@ -15,17 +15,17 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'PAGE.OSMREPO.OSMREPOTITLE' | translate}}</div>
-    <span class="button">
+    <span class="button mb-0">
         <button class="btn btn-primary" type="button" (click)="addOsmrepo()" placement="top" container="body" ngbTooltip="{{'PAGE.OSMREPO.ADDOSMREPO' | translate}}">
             <i class="fas fa-plus-circle" aria-hidden="true"></i>
             {{'PAGE.OSMREPO.ADDOSMREPO' | translate}}
         </button>
     </span>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+<div class="mt-2 mb-2 form-group justify-content-end list-utilites-actions">
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index af52927..61df6a9 100644 (file)
@@ -23,7 +23,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </button>
   </div>
   <div class="modal-body modal-body-custom-height netsliceinstantiate-ns">
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-12 col-form-label mandatory-label"
         [ngClass]="{'text-danger': netSliceInstantiateForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
       <label class="col-sm-4 col-form-label" for="nsiName">{{'PAGE.NSTINSTANCEINSTANTIATE.NSNAME' | translate}}*</label>
@@ -33,7 +33,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           id="nsiName" [ngClass]="{ 'is-invalid': submitted && f.nsiName.errors }" required>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label"
         for="nsiDescription">{{'PAGE.NSTINSTANCEINSTANTIATE.DESCRIPTION' | translate}}*</label>
       <div class="col-sm-8">
@@ -42,7 +42,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           [ngClass]="{ 'is-invalid': submitted && f.nsiDescription.errors }" required></textarea>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="nstId">{{'PAGE.NSTINSTANCEINSTANTIATE.NSTID' | translate}}*</label>
       <div class="col-sm-8">
         <ng-select [items]="netSliceSelect" bindLabel="name" bindValue="_id"
@@ -52,7 +52,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </ng-select>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label"
         for="vimAccountId">{{'PAGE.NSTINSTANCEINSTANTIATE.VIMACCOUNT' | translate}}*</label>
       <div class="col-sm-8">
@@ -63,29 +63,27 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </ng-select>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="ssh_keys">{{'PAGE.NSTINSTANCEINSTANTIATE.SSHKEY' | translate}}</label>
       <div class="col-sm-8">
         <textarea class="form-control" placeholder="{{'PAGE.NSTINSTANCEINSTANTIATE.SSHKEYMSG' | translate}}"
           formControlName="ssh_keys" id="ssh_keys"></textarea>
         <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
         <div class="custom-file">
-          <input type="file" #fileInputSSH class="custom-file-input" (change)="sshFile($event.target.files)"
+          <input type="file" #fileInputSSH class="fileupload custom-file-input" (change)="sshFile($event.target.files)"
             id="customSSHFile">
-          <label class="custom-file-label" #fileInputSSHLabel for="customSSHFile">{{'CHOOSEFILE' | translate}}</label>
         </div>
       </div>
     </div>
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-4 col-form-label" for="config">{{'CONFIG' | translate}}</label>
       <div class="col-sm-8">
         <textarea class="form-control" placeholder="{{'YAMLCONFIG' | translate}}" formControlName="config"
           id="config"></textarea>
         <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
         <div class="custom-file">
-          <input type="file" #fileInputConfig class="custom-file-input" (change)="configFile($event.target.files)"
-            id="customConfigFile">
-          <label class="custom-file-label" #fileInputConfigLabel for="customConfigFile">{{'CHOOSEFILE' | translate}}</label>
+          <input type="file" #fileInputConfig class="fileupload custom-file-input" (change)="configFile($event.target.files)"
+          id="customConfigFile">
         </div>
       </div>
     </div>
index fb0abda..ab8b72f 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Instantiate NS Modal Component.
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, ElementRef, Injector, OnInit, ViewChild } from '@angular/core';
 import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -33,7 +32,7 @@ import * as jsyaml from 'js-yaml';
 import { NetworkSliceData } from 'NetworkSliceModel';
 import { NSICREATEPARAMS } from 'NSDModel';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { VimAccountDetails } from 'VimAccountModel';
 /**
  * Creating component
index 2bbd837..428515e 100644 (file)
@@ -23,7 +23,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </button>
     </div>
     <div class="modal-body modal-body-custom-height instantiate-ns">
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-12 col-form-label mandatory-label"
                 [ngClass]="{'text-danger': instantiateForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
             <label class="col-sm-4 col-form-label"
@@ -35,7 +35,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     [ngClass]="{ 'is-invalid': submitted && f.nsName.errors }" required>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label"
                 for="nsDescription">{{'PAGE.INSTANCEINSTANTIATE.DESCRIPTION' | translate}}*</label>
             <div class="col-sm-8">
@@ -44,7 +44,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     [ngClass]="{ 'is-invalid': submitted && f.nsDescription.errors }" required></textarea>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label" for="nsdId">{{'PAGE.INSTANCEINSTANTIATE.NSID' | translate}}*</label>
             <div class="col-sm-8">
                 <ng-select [items]="nsdSelect" bindLabel="name" bindValue="_id"
@@ -54,7 +54,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </ng-select>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label"
                 for="vimAccountId">{{'PAGE.INSTANCEINSTANTIATE.VIMACCOUNT' | translate}}*</label>
             <div class="col-sm-6">
@@ -82,7 +82,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </button>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label"
                 for="ssh_keys">{{'PAGE.INSTANCEINSTANTIATE.SSHKEY' | translate}}</label>
             <div class="col-sm-8">
@@ -90,24 +90,20 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     formControlName="ssh_keys" id="ssh_keys"></textarea>
                 <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
                 <div class="custom-file">
-                    <input type="file" #fileInputSSH class="custom-file-input" (change)="sshFile($event.target.files)"
+                    <input type="file" #fileInputSSH class="fileupload custom-file-input" (change)="sshFile($event.target.files)"
                         id="customSSHFile">
-                    <label class="custom-file-label" #fileInputSSHLabel
-                        for="customSSHFile">{{'CHOOSEFILE' | translate}}</label>
                 </div>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label" for="config">{{'CONFIG' | translate}}</label>
             <div class="col-sm-8">
                 <textarea class="form-control" placeholder="{{'YAMLCONFIG' | translate}}" formControlName="config"
                     id="config"></textarea>
                 <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
                 <div class="custom-file">
-                    <input type="file" #fileInputConfig class="custom-file-input"
+                    <input type="file" #fileInputConfig class="fileupload custom-file-input"
                         (change)="configFile($event.target.files)" id="customConfigFile">
-                    <label class="custom-file-label" #fileInputConfigLabel
-                        for="customConfigFile">{{'CHOOSEFILE' | translate}}</label>
                 </div>
             </div>
         </div>
index e0798d1..9ba89da 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Instantiate NS Modal Component.
  */
-import { isNullOrUndefined } from 'util';
 import { Component, ElementRef, Injector, OnInit, ViewChild } from '@angular/core';
 import { FormBuilder, FormGroup, Validators } from '@angular/forms';
 import { Router } from '@angular/router';
@@ -31,7 +30,7 @@ import { environment } from 'environment';
 import * as jsyaml from 'js-yaml';
 import { NSCREATEPARAMS, NSData, NSDDetails } from 'NSDModel';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { VimAccountDetails } from 'VimAccountModel';
 
 /**
index 6d41e11..176af9c 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'PAGE.DASHBOARD.NETSLICETEMPLATE' | translate}}</div>
 </div>
 <div class="row">
@@ -27,8 +27,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
     </div>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+<div class="mt-2 mb-2 form-group justify-content-end list-utilites-actions">
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index 5b67268..c8229f3 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
   <div class="d-flex align-items-center header-style">NS {{'PACKAGES' | translate}}</div>
   <span class="button">
     <button class="btn btn-primary" type="button" placement="top" container="body" ngbTooltip="{{'PAGE.NSPACKAGE.ADDNSPACKAGE' | translate}}"
@@ -33,8 +33,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </div>
   </div>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-  <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+<div class="mt-2 mb-0 form-group justify-content-end list-utilites-actions">
+  <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
   <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index c4ec96d..d8c7df3 100644 (file)
@@ -23,44 +23,44 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
       <span class="topology_title" *ngIf="isShowVLDetails">{{'PAGE.TOPOLOGY.VIRTUALLINK' | translate}}</span>
       <span class="topology_title" *ngIf="isShowVNFDetails">{{'PAGE.TOPOLOGY.VNF' | translate}}</span>
       <span class="topology_title" *ngIf="isShowCPDetails">{{'PAGE.TOPOLOGY.CONNECTIONPOINT' | translate}}</span>
-      <button (click)="toggleSidebar()" class="close" type="button">
+      <button (click)="toggleSidebar()" class="close-nsd" type="button">
         <i class="fas fa-times-circle text-danger" aria-hidden="true"></i>
       </button>
     </div>
     <div class="sidebar-body">
       <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 mb-2" *ngIf="isShowNSDDetails">
         <div class="row">
-          <div class="col-12 p-0">
+          <div class="col-12">
             <form autocomplete="off">
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'ID' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <input type="text" class="form-control" placeholder="{{ 'ID' | translate }}" name="id"
                     [(ngModel)]="nsPackageDetails.id">
                 </div>
               </div>
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'NAME' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <input type="text" class="form-control" placeholder="{{ 'NAME' | translate }}" name="name"
                     [(ngModel)]="nsPackageDetails.name">
                 </div>
               </div>
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'DESCRIPTION' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <textarea rows="5" cols="50" class="form-control" placeholder="{{ 'DESCRIPTION' | translate }}"
                     name="description" [(ngModel)]="nsPackageDetails.description"></textarea>
                 </div>
               </div>
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'VERSION' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <input type="text" class="form-control" placeholder="{{ 'VERSION' | translate }}" name="version"
                     [(ngModel)]="nsPackageDetails.version">
                 </div>
               </div>
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'DESIGNER' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <input type="text" class="form-control" placeholder="{{ 'DESIGNER' | translate }}" name="designer"
@@ -162,7 +162,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
 </ng-sidebar-container>
 <div class="container-fluid text-dark">
   <div class="row bg-white ns-composer-form">
-    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3 pl-0 px-0">
+    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3 ps-0 px-0">
       <div class="row">
         <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 mb-2">
           <fieldset class="p-2">
@@ -172,7 +172,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <ul class="list-group list-group-flush dragable">
               <li class="list-group-item" draggable="true" (dragstart)="drag($event)" id="vl">
                 <img src="assets/images/VL.svg" class="ns-svg" draggable="false"/>
-                &nbsp;<span class="span-overflow-text font-weight-bold">{{'PAGE.TOPOLOGY.VL' | translate}}</span>
+                &nbsp;<span class="span-overflow-text fw-bold">{{'PAGE.TOPOLOGY.VL' | translate}}</span>
                 <span class="drag-icon pull-right"><i class="fas fa-arrows-alt"></i></span>
               </li>
             </ul>
@@ -190,7 +190,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 [attr.data-id]="list['id']" *ngFor="let list of vnfList" placement="top"
               container="body" ngbTooltip="{{ list['product-name'] }}">
                 <img src="assets/images/VNFD.svg" class="ns-svg" draggable="false"/>
-                &nbsp;<span class="span-overflow-text font-weight-bold">{{ list['product-name'] }}</span>
+                &nbsp;<span class="span-overflow-text fw-bold">{{ list['product-name'] }}</span>
                 <span class="drag-icon pull-right"><i class="fas fa-arrows-alt"></i></span>
               </li>
             </ul>
@@ -200,7 +200,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </div>
     <div class="col-xs-9 col-sm-9 col-md-9 col-lg-9">
       <div class="row">
-        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 pl-0">
+        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 ps-0">
           <div class="btn-group list" role="group" aria-label="Basic example">
             <button type="button" class="btn btn-primary topology-btn" (click)="onFreeze()"
               [class.pinned]="classApplied" placement="top" container="body" ngbTooltip="{{(classApplied ? 'UNFREEZE' : 'FREEZE') | translate}}">
@@ -216,7 +216,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             </button>
           </div>
         </div>
-        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 text-right pr-0 badgegroup">
+        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 text-end pe-0 badgegroup">
           <span class="badge badge-primary badge-pill bg-white text-body font-weight-bold">
             <img src="assets/images/VNFD.svg" class="ns-svg" draggable="false"/>
             <br>{{'PAGE.TOPOLOGY.VNF' | translate}}</span>
index d750ccc..34eb552 100644 (file)
  limitations under the License.
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
-*/
\ No newline at end of file
+*/
+.close-nsd {
+    opacity: 1;
+    background-color: transparent;
+    border: 0;
+    position: absolute;
+    right: 4px;
+    font-size: 1.3125rem;
+}
\ No newline at end of file
index 4552226..916ac8b 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file NS Compose Component
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, ElementRef, Injector, ViewChild, ViewEncapsulation } from '@angular/core';
 import { ActivatedRoute, Router } from '@angular/router';
@@ -43,7 +42,7 @@ import {
   Tick, TickPath, VLC, VLD, VNFPROFILE
 } from 'NSDModel';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { VNFD, VNFData } from 'VNFDModel';
 
 /**
index a947069..3ed9543 100644 (file)
@@ -27,44 +27,44 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         translate}}</span>
       <span class="topology_title" *ngIf="showRightSideInfo === 'intcpInfo'">{{'PAGE.TOPOLOGY.INTCONNECTIONPOINT' |
         translate}}</span>
-      <button (click)="toggleSidebar()" class="close" type="button">
+      <button (click)="toggleSidebar()" class="close-vnfd" type="button">
         <i class="fas fa-times-circle text-danger" aria-hidden="true"></i>
       </button>
     </div>
     <div class="sidebar-body">
       <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 mb-2" *ngIf="showRightSideInfo === 'vnfdInfo'">
         <div class="row">
-          <div class="col-12 p-0">
+          <div class="col-12">
             <form>
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'ID' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <input type="text" class="form-control" placeholder="{{ 'ID' | translate }}" name="id"
                     [(ngModel)]="vnfdInfo.id">
                 </div>
               </div>
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'PRODUCTNAME' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <input type="text" class="form-control" placeholder="{{ 'PRODUCTNAME' | translate }}"
                     name="product-name" [(ngModel)]="vnfdInfo['product-name']">
                 </div>
               </div>
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'DESCRIPTION' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <textarea rows="5" cols="50" class="form-control" placeholder="{{ 'DESCRIPTION' | translate }}"
                     name="description" [(ngModel)]="vnfdInfo.description"></textarea>
                 </div>
               </div>
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'VERSION' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <input type="text" class="form-control" placeholder="{{ 'VERSION' | translate }}" name="version"
                     [(ngModel)]="vnfdInfo.version">
                 </div>
               </div>
-              <div class="form-group row">
+              <div class="form-group row mb-3">
                 <label class="col-sm-4 col-form-label">{{ 'PROVIDER' | translate }}</label>
                 <div class="col-sm-8 p-0">
                   <input type="text" class="form-control" placeholder="{{ 'PROVIDER' | translate }}" name="provider"
@@ -182,7 +182,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
 </ng-sidebar-container>
 <div class="container-fluid text-dark">
   <div class="row bg-white vnf-composer-form">
-    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3 pl-0 px-0">
+    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3 ps-0 px-0">
       <div class="row">
         <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 mb-2">
           <fieldset class="p-2">
@@ -212,7 +212,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </div>
     <div class="col-xs-9 col-sm-9 col-md-9 col-lg-9">
       <div class="row">
-        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 pl-0">
+        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 ps-0">
           <div class="btn-group list" role="group" aria-label="Basic example">
             <button type="button" class="btn btn-primary topology-btn" (click)="onFreeze()"
               [class.pinned]="classApplied" placement="top" container="body"
@@ -229,7 +229,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             </button>
           </div>
         </div>
-        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 text-right pr-0 badgegroup">
+        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 text-end pe-0 badgegroup">
           <span class="badge badge-primary badge-pill bg-white text-body font-weight-bold">
             <img src="assets/images/VDU.svg" class="vnf-svg" draggable="false" />
             <br>{{'PAGE.TOPOLOGY.VDU' | translate}}</span>
index 4473c67..aa6b894 100644 (file)
  limitations under the License.
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
-*/
\ No newline at end of file
+*/
+.close-vnfd {
+    opacity: 1;
+    background-color: transparent;
+    border: 0;
+    position: absolute;
+    right: 4px;
+    font-size: 1.3125rem;
+}
\ No newline at end of file
index eabd2b7..9fab0da 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file VNFComposerComponent
  */
- import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, ElementRef, Injector, ViewChild, ViewEncapsulation } from '@angular/core';
 import { ActivatedRoute, Router } from '@angular/router';
@@ -33,7 +32,7 @@ import { environment } from 'environment';
 import * as HttpStatus from 'http-status-codes';
 import * as jsyaml from 'js-yaml';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { COMPOSERNODES, EXTCPD, GRAPHDETAILS, INTCPD, IVLD, Tick, TickPath, VDU, VDUINTCPD, VNFD, VNFDATA, VNIR } from 'VNFDModel';
 
 /**
index 2d7298d..675e6d7 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">VNF {{'PACKAGES' | translate}}</div>
     <span class="button">
         <button class="btn btn-primary" type="button" placement="top" container="body" ngbTooltip="{{'PAGE.VNFPACKAGE.ADDVNFPACKAGE' | translate}}"
@@ -33,8 +33,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
     </div>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+<div class="mt-2 mb-2 form-group justify-content-end list-utilites-actions">
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index ec15861..9186210 100644 (file)
@@ -15,17 +15,17 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'PAGE.DASHBOARD.PROJECTS' | translate}}</div>
-    <span class="button">
+    <span class="button text-end">
         <button class="btn btn-primary" type="button" (click)="projectAdd()" placement="top" container="body" ngbTooltip="{{'PAGE.PROJECT.NEWPROJECT' | translate}}">
             <i class="fas fa-plus-circle" aria-hidden="true"></i>
             {{'PAGE.PROJECT.NEWPROJECT' | translate}}
         </button>
     </span>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+<div class="mt-2 mb-2 form-group justify-content-end list-utilites-actions">
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index 982421e..2c0e105 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Project details Component.
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, OnDestroy, OnInit } from '@angular/core';
 import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
 import { TranslateService } from '@ngx-translate/core';
@@ -32,7 +31,7 @@ import { ProjectData, ProjectDetails } from 'ProjectModel';
 import { ProjectsActionComponent } from 'ProjectsAction';
 import { RestService } from 'RestService';
 import { Subscription } from 'rxjs';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 
 /**
  * Creating component
index 4e613fe..26a16c8 100644 (file)
@@ -19,13 +19,13 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
   <div class="modal-header">
     <h4 class="modal-title" id="modal-basic-title">{{ (getProjectType == 'Add' ? 'NEW' : 'EDIT') | translate}}
       {{'PROJECT' | translate}}</h4>
-    <button class="button-xs" type="button" class="close" aria-label="Close" (click)="activeModal.close()">
+    <button class="button-xs-2" type="button" class="close" aria-label="Close" (click)="activeModal.close()">
       <i class="fas fa-times-circle text-danger"></i>
     </button>
   </div>
   <div class="modal-body modal-body-custom-height">
     <div class="row" *ngIf="getProjectType === 'Add'">
-      <label class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10">{{'RECENTLY' | translate}}
+      <label class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10 mb-2">{{'RECENTLY' | translate}}
         {{'CREATED' | translate}} {{'PROJECT' | translate}}:
         <b>{{(recentProject)?recentProject.name:''}}</b>
       </label>
@@ -39,7 +39,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           formControlName="project_name" [ngClass]="{ 'is-invalid': submitted && f.project_name.errors }" required>
       </div>
     </div>
-    <div class="form-group row" *ngIf="getProjectType === 'Add'">
+    <div class="form-group row mt-3" *ngIf="getProjectType === 'Add'">
       <label class="col-sm-4 col-form-label">{{'DOMAIN' | translate}} {{'NAME' | translate}}</label>
       <div class="col-sm-4">
         <ng-select [clearable]="false" placeholder="{{'SELECT' | translate}}" [items]="domains" bindLabel="title"
@@ -47,17 +47,17 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           [ngClass]="{ 'is-invalid': submitted && f.domain_name.errors }"></ng-select>
       </div>
     </div>
-    <div class="form-check form-check-inline ml-2">
-      <input class="form-check-input" type="checkbox" formControlName="enable_quota" (change)="checkQuota()"
+    <div class="form-check form-check-inline mt-3">
+      <input class="quotacheck form-check-input" type="checkbox" formControlName="enable_quota" (change)="checkQuota()"
         id="quotaCheck" *ngIf="getProjectType === 'Add' || quotaRefs === null">
-      <label class="form-check-label" for="quotaCheck"><b>{{'PAGE.PROJECT.QUOTA' | translate}}</b></label>
+      <label class="form-check-label" for="quotaCheck" [ngClass]="getProjectType === 'Edit'&& quotaRefs !== null?'quotaCheck-label':''"><b>{{'PAGE.PROJECT.QUOTA' | translate}}</b></label>
     </div>
-    <div class="row mt-1" [ngbCollapse]="!f.enable_quota.value">
-      <div class="form-group col-sm-6" *ngFor="let quota of quotaItems;">
+    <div class="row" [ngbCollapse]="!f.enable_quota.value">
+      <div class="form-group col-sm-6 mb-2 mt-2" *ngFor="let quota of quotaItems;">
         <div class="row">
           <label class="col-sm-7 col-form-label">{{quota.title | translate}}*</label>
           <div class="col-sm-5">
-            <input placeholder="{{'COUNT' | translate}}" type="number"
+            <input placeholder="{{'COUNT' | translate}}" type="number" min="0"
               class="form-control" [formControlName]="quota.value" [ngClass]="{ 'is-invalid': submitted && f[quota.value].errors }">
           </div>
         </div>
index 021d205..568a9c9 100644 (file)
  limitations under the License.
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
-*/
\ No newline at end of file
+*/
+@import "../../../assets/scss/variable.scss";
+.quotacheck {
+   box-shadow: none;
+   border-radius: 2px;
+   border-color: $gray-600;
+}
+.form-check {
+   padding-left: 30px;
+}
+.quotaCheck-label {
+   position: absolute;
+   left: 26px;
+}
\ No newline at end of file
index af6388d..2d45ef6 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Project Add Modal
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { AbstractControl, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
@@ -30,7 +29,7 @@ import { environment } from 'environment';
 import { ProjectData, ProjectDetails, QUOTAITEM, QUOTA_ITEMS } from 'ProjectModel';
 import { ProjectService } from 'ProjectService';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 
 /**
  * Creating component
index 7bb2a1f..7f33a21 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
   <div class="d-flex align-items-center header-style">
     {{ (getRoleType == 'Add' ? 'PAGE.ROLES.CREATEROLE' : 'PAGE.ROLES.EDITROLE') | translate}}</div>
   <span class="button">
@@ -30,22 +30,22 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     <label class="col-sm-12 col-form-label mandatory-label"
       [ngClass]="{'text-danger': roleForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
     <label class="col-sm-2 col-form-label">{{'NAME' | translate}}*</label>
-    <div class="col-sm-5">
+    <div class="col-sm-5 mb-3">
       <input placeholder="{{'NAME' | translate}}" type="text" class="form-control" maxlength="30"
         formControlName="roleName" [ngClass]="{ 'is-invalid': submitted && f.roleName.errors }" required>
     </div>
   </div>
   <div class="form-group row" *ngIf="viewMode == 'text'">
     <label class="col-sm-2 col-form-label">{{'PAGE.ROLES.PERMISSIONS' | translate}}</label>
-    <div class="col-sm-5">
+    <div class="col-sm-5 mb-3">
       <textarea placeholder="{{'PAGE.ROLES.YAMLPERMISSIONS' | translate}}" rows="10" cols="50" type="text"
         class="form-control" formControlName="permissions"></textarea>
     </div>
   </div>
   <div class="form-group row" [ngClass]="{ 'justify-content-end': viewMode == 'text' }">
-    <div class="col-sm-6">
+    <div class="col-sm-6 mb-3">
       <button type="button" class="btn btn-danger" routerLink="/roles/details">{{'CANCEL' | translate}}</button>
-      <button class="btn btn-primary ml-3"
+      <button class="btn btn-primary ms-3"
         type="submit">{{ (getRoleType == 'Add' ? 'CREATE' : 'APPLY') | translate}}</button>
     </div>
   </div>
@@ -54,7 +54,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
   <ngb-panel *ngFor="let permissionGroup of rolePermissions; let i = index">
     <ng-template ngbPanelHeader let-opened="opened">
       <div class="d-flex align-items-center justify-content-between">
-        <button ngbPanelToggle class="btn text-dark container-fluid text-left pl-0"><i
+        <button ngbPanelToggle class="btn text-dark container-fluid text-start ps-0 p-10"><i
           [ngClass]="{ 'fas': true, 'fa-angle-down': opened, 'fa-angle-right': !opened }"></i> {{permissionGroup.title}}</button>
       </div>
     </ng-template>
@@ -84,9 +84,9 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </ng-template>
   </ngb-panel>
 </ngb-accordion>
-<div class="float-right" *ngIf="viewMode == 'preview'">
+<div class="float-end" *ngIf="viewMode == 'preview'">
   <button type="button" class="btn btn-danger" routerLink="/roles/details">{{'CANCEL' | translate}}</button>
-  <button class="btn btn-primary ml-3"
+  <button class="btn btn-primary ms-3"
     (click)="roleCheck()">{{ (getRoleType == 'Add' ? 'CREATE' : 'APPLY') | translate}}</button>
 </div>
 <app-loader [waitingMessage]="message" *ngIf="isLoadingResults"></app-loader>
\ No newline at end of file
index 362973a..c2d0885 100644 (file)
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 */
-@import '../../../assets/scss/mixins/mixin';
-@import '../../../assets/scss/variable';
- .custom-button{
+@import "../../../assets/scss/mixins/mixin";
+@import "../../../assets/scss/variable";
+button:focus:not(:focus-visible) {
+  border-color: $gray-400;
+}
+.custom-button {
   label {
-    @include padding-value(2,2,2,2);
+    @include padding-value(2, 2, 2, 2);
+    border: none;
     &.active {
+      border: none;
       @include background(null, $white, null, null, null);
-      span{
+      span {
         img {
           opacity: 1;
         }
     }
     span {
       display: inline-block;
-      @include wh-value(30px,30px);
+      @include wh-value(30px, 30px);
       cursor: pointer;
       border-radius: 50%;
-      @include border(all,2,solid, $white);
+      @include border(all, 2, solid, $white);
       @include box-shadow(0px, 1px, 3px, 0px, $dark);
       @include background(null, null, null, no-repeat, center);
       text-align: center;
       @include line-height(25px);
       img {
-        width:50%;
+        width: 50%;
         opacity: 0;
         @include transition(all, 0.3, null, ease);
       }
index 59196ea..ae85112 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Roles Create and Edit Component
  */
-import { isNullOrUndefined } from 'util';
 import { HttpClient, HttpHeaders } from '@angular/common/http';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -30,7 +29,7 @@ import { environment } from 'environment';
 import * as jsonpath from 'jsonpath';
 import { RestService } from 'RestService';
 import { Permission, PermissionGroup, RoleConfig, RoleData } from 'RolesModel';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 
 /**
  * Creating component
index 28a3fe7..7ee4a2e 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'ROLES' | translate}}</div>
     <span class="button">
         <button class="btn btn-primary" type="button" (click)="createRole()" placement="top"
@@ -25,8 +25,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </button>
     </span>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+<div class="mt-2 mb-2 form-group justify-content-end list-utilites-actions">
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index 9c2e3e3..473a0c6 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Roles Deatils component.
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, OnInit } from '@angular/core';
 import { Router } from '@angular/router';
 import { TranslateService } from '@ngx-translate/core';
@@ -30,7 +29,7 @@ import { RestService } from 'RestService';
 import { RolesActionComponent } from 'RolesAction';
 import { RoleData, RoleDetails } from 'RolesModel';
 import { Subscription } from 'rxjs';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 
 /**
  * Creating component
index 5937862..c9893c1 100644 (file)
@@ -23,7 +23,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </button>
     </div>
     <div class="modal-body modal-body-custom-height">
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-12 col-form-label mandatory-label"
                 [ngClass]="{'text-danger': sdnControllerForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
             <label class="col-sm-4 col-form-label" for="name">{{'NAME' | translate}}*</label>
@@ -32,7 +32,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     formControlName="name" id="name" [ngClass]="{ 'is-invalid': submitted && f.name.errors }" required>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label" for="sdn_type">{{'TYPE' | translate}}*</label>
             <div class="col-sm-8">
                 <ng-select [items]="sdnType" placeholder="{{'SELECT' | translate}}" bindLabel="title" bindValue="value"
@@ -42,7 +42,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 <small class="text-info">{{'TYPEINFO' | translate}}</small>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label" for="username">{{'USERNAME' | translate}}*</label>
             <div class="col-sm-8">
                 <input autocomplete="off" class="form-control" placeholder="{{'USERNAME' | translate}}" type="text"
@@ -50,7 +50,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     required>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label" for="password">{{'PASSWORD' | translate}}*</label>
             <div class="col-sm-8">
                 <input autocomplete="off" class="form-control" placeholder="{{'PASSWORD' | translate}}" type="password"
@@ -58,7 +58,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     [ngClass]="{ 'is-invalid': submitted && f.password.errors }" required>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label" for="ip">{{'IP' | translate}}*</label>
             <div class="col-sm-8">
                 <input autocomplete="off" class="form-control" placeholder="{{'IP' | translate}}" type="text"
@@ -68,7 +68,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </div>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label" for="port">{{'PORT' | translate}}*</label>
             <div class="col-sm-8">
                 <input autocomplete="off" class="form-control" placeholder="{{'PORT' | translate}}" type="text"
@@ -78,7 +78,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </div>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label" for="dpid">{{'PAGE.SDNCONTROLLER.DPID' | translate}}*</label>
             <div class="col-sm-8">
                 <input autocomplete="off" class="form-control"
@@ -89,7 +89,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </div>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-4 col-form-label" for="version">{{'VERSION' | translate}}</label>
             <div class="col-sm-8">
                 <input autocomplete="off" class="form-control" placeholder="{{'VERSION' | translate}}" type="text"
index c316942..3f00d91 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'PAGE.SDNCONTROLLER.REGISTEREDSDNCONTROLLER' | translate}}</div>
     <span class="button">
         <button class="btn btn-primary" type="button" placement="top" container="body" ngbTooltip="{{'PAGE.SDNCONTROLLER.NEWSDNCONTROLLER' | translate}}"
@@ -25,15 +25,15 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </button>
     </span>
 </div>
-<div class="row mt-2 mb-0 list-utilites-actions">
-    <div class="col-auto mr-auto">
+<div class="mt-2 mb-2 list-utilites-actions">
+    <div class="col-auto me-auto">
         <nav class="custom-items-config">
             <span><i class="fas fa-clock text-warning"></i>{{operationalStateFirstStep}}</span>
             <span><i class="fas fa-check-circle text-success"></i>{{operationalStateSecondStep}}</span>
             <span><i class="fas fa-times-circle text-danger"></i>{{operationalStateThirdStep}}</span>
         </nav>
     </div>
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index d89ad24..3c1c15e 100644 (file)
@@ -23,91 +23,89 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
 </div>
 <div class="modal-body modal-body-custom-height p-0">
     <table class="table table-sm table-hover table-layout-fixed mb-0" *ngIf="sdnDetails else noData">
-        <tbody>
-            <tr>
-                <th>
-                    {{'ID' | translate}}
-                </th>
-                <td>
-                    {{(sdnDetails._id)?sdnDetails._id:'-'}}
-                </td>
-            </tr>
-            <tr>
-                <th>
-                    {{'NAME' | translate}}
-                </th>
-                <td>
-                    {{(sdnDetails.name)?sdnDetails.name:'-'}}
-                </td>
-            </tr>
-            <tr>
-                <th>
-                    {{'TYPE' | translate}}
-                </th>
-                <td>
-                    {{(sdnDetails.type)?sdnDetails.type:'-'}}
-                </td>
-            </tr>
-            <tr>
-                <th>
-                    {{'OPERATIONALSTATE' | translate}}
-                </th>
-                <td>
-                    <span class="badge ml-1" [ngClass]="{'badge-warning text-white':sdnDetails._admin.operationalState === operationalStateFirstStep,
-          'badge-success':sdnDetails._admin.operationalState === operationalStateSecondStep,
-          'badge-danger':sdnDetails._admin.operationalState === operationalStateThirdStep}">
-                        {{(sdnDetails._admin.operationalState)?sdnDetails._admin.operationalState:'-'}}</span>
-                </td>
-            </tr>
-            <tr>
-                <th>
-                    {{'URL' | translate}}
-                </th>
-                <td>
-                    {{(sdnDetails.url)?sdnDetails.url:'-'}}
-                </td>
-            </tr>
-            <tr>
-                <th>
-                    {{'USER' | translate}}
-                </th>
-                <td>
-                    {{(sdnDetails.user)?sdnDetails.user:'-'}}
-                </td>
-            </tr>
-            <tr>
-                <th>
-                    {{'VERSION' | translate}}
-                </th>
-                <td>
-                    {{(sdnDetails.version)?sdnDetails.version:'-'}}
-                </td>
-            </tr>
-            <tr>
-                <th>
-                    {{'PAGE.SDNCONTROLLER.DPID' | translate}}
-                </th>
-                <td>
-                    {{(sdnDetails.dpid)?sdnDetails.dpid:'-'}}
-                </td>
-            </tr>
-            <tr>
-                <th>
-                    {{'CREATED' | translate}}
-                </th>
-                <td>
-                    {{(sdnDetails._admin.created)?this.sharedService.convertEpochTime(sdnDetails._admin.created):'-'}}
-                </td>
-            </tr>
-            <tr>
-                <th>
-                    {{'MODIFIED' | translate}}
-                </th>
-                <td>
-                    {{(sdnDetails._admin.modified)?this.sharedService.convertEpochTime(sdnDetails._admin.modified):'-'}}
-                </td>
-            </tr>
-        </tbody>
+        <tr>
+            <th>
+                {{'ID' | translate}}
+            </th>
+            <td>
+                {{(sdnDetails._id)?sdnDetails._id:'-'}}
+            </td>
+        </tr>
+        <tr>
+            <th>
+                {{'NAME' | translate}}
+            </th>
+            <td>
+                {{(sdnDetails.name)?sdnDetails.name:'-'}}
+            </td>
+        </tr>
+        <tr>
+            <th>
+                {{'TYPE' | translate}}
+            </th>
+            <td>
+                {{(sdnDetails.type)?sdnDetails.type:'-'}}
+            </td>
+        </tr>
+        <tr>
+            <th>
+                {{'OPERATIONALSTATE' | translate}}
+            </th>
+            <td>
+                <span class="badge ms-1" [ngClass]="{'badge bg-warning text-white':sdnDetails._admin.operationalState === operationalStateFirstStep,
+          'badge bg-success text-white':sdnDetails._admin.operationalState === operationalStateSecondStep,
+          'badge bg-danger text-white':sdnDetails._admin.operationalState === operationalStateThirdStep}">
+                    {{(sdnDetails._admin.operationalState)?sdnDetails._admin.operationalState:'-'}}</span>
+            </td>
+        </tr>
+        <tr>
+            <th>
+                {{'URL' | translate}}
+            </th>
+            <td>
+                {{(sdnDetails.url)?sdnDetails.url:'-'}}
+            </td>
+        </tr>
+        <tr>
+            <th>
+                {{'USER' | translate}}
+            </th>
+            <td>
+                {{(sdnDetails.user)?sdnDetails.user:'-'}}
+            </td>
+        </tr>
+        <tr>
+            <th>
+                {{'VERSION' | translate}}
+            </th>
+            <td>
+                {{(sdnDetails.version)?sdnDetails.version:'-'}}
+            </td>
+        </tr>
+        <tr>
+            <th>
+                {{'PAGE.SDNCONTROLLER.DPID' | translate}}
+            </th>
+            <td>
+                {{(sdnDetails.dpid)?sdnDetails.dpid:'-'}}
+            </td>
+        </tr>
+        <tr>
+            <th>
+                {{'CREATED' | translate}}
+            </th>
+            <td>
+                {{(sdnDetails._admin.created)?this.sharedService.convertEpochTime(sdnDetails._admin.created):'-'}}
+            </td>
+        </tr>
+        <tr>
+            <th>
+                {{'MODIFIED' | translate}}
+            </th>
+            <td>
+                {{(sdnDetails._admin.modified)?this.sharedService.convertEpochTime(sdnDetails._admin.modified):'-'}}
+            </td>
+        </tr>
         <tr>
             <th>
                 {{'DEPLOYED' | translate}}
index c68960c..7ff1ee9 100644 (file)
  limitations under the License.
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
-*/
\ No newline at end of file
+*/
+@import "../../../assets/scss/variable.scss";
+.table tr:hover {
+       color: $body-color;
+       background-color: #f6fafe;
+  }
+  .table thead th {
+       vertical-align: bottom;
+       border-bottom: 2px solid rgba(0, 0, 0, .1);
+  }
+  .table th, .table td {
+       padding: 5px;
+       vertical-align: top;
+       border-top: 1px solid rgba(0, 0, 0, .1);
+       border-bottom: transparent;
+  }
+  .table b {
+       background: none;
+       color: $body-color;
+       padding-right: 0px;
+       padding-left: 0px;
+  }
\ No newline at end of file
index d3a0b08..6ae0f32 100644 (file)
@@ -28,7 +28,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
       <label class="col-sm-12 col-form-label mandatory-label"
         [ngClass]="{'text-danger': userForm.invalid === true && submitted === true,'message': isPassword && userForm.invalid === true && submitted  }">{{'MANDATORYCHECK'|
         translate}}</label>
-      <div class="row form-group" *ngIf="userType === 'add' || userType === 'editUserName'">
+      <div class="row form-group mb-3" *ngIf="userType === 'add' || userType === 'editUserName'">
         <div class="col-sm-4">
           <label for="userName">{{'PAGE.USERS.USERNAME' | translate}} *</label>
         </div>
@@ -43,7 +43,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
       </div>
       <ng-container *ngIf="userType === 'add' || userType === 'editPassword' || userType === 'changePassword'">
-        <div class="row form-group" *ngIf=" userType === 'changePassword'">
+        <div class="row form-group mb-3" *ngIf=" userType === 'changePassword'">
           <div class="col-sm-4">
             <label for="oldpassword">{{'PAGE.USERS.OLDPASSWORD' | translate}} *</label>
           </div>
@@ -53,7 +53,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
               [ngClass]="{ 'is-invalid': submitted && f.old_password.errors }" required>
           </div>
         </div>
-        <div class="row form-group" *ngIf="userType === 'add' || userType === 'editPassword'">
+        <div class="row form-group mb-3" *ngIf="userType === 'add' || userType === 'editPassword'">
           <div class="col-sm-4">
             <label for="password">{{'PAGE.USERS.PASSWORD' | translate}} *</label>
           </div>
@@ -68,7 +68,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
               {{'PAGE.LOGIN.PASSWORDMINLENGTHVALIDMESSAGE' | translate}} </div>
           </div>
         </div>
-        <div class="row form-group" *ngIf="userType === 'changePassword'">
+        <div class="row form-group mb-3" *ngIf="userType === 'changePassword'">
           <div class="col-sm-4">
             <label for="password">{{'PAGE.USERS.NEWPASSWORD' | translate}} *</label>
           </div>
@@ -83,7 +83,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
               {{'PAGE.LOGIN.PASSWORDMINLENGTHVALIDMESSAGE' | translate}} </div>
           </div>
         </div>
-        <div class="row form-group">
+        <div class="row form-group mb-3">
           <div class="col-sm-4">
             <label for="password2">{{'PAGE.USERS.CONFPASSWORD' | translate}} *</label>
           </div>
@@ -100,7 +100,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
           </div>
         </div>
       </ng-container>
-      <div class="form-group row" *ngIf="userType === 'add'">
+      <div class="form-group row mb-3" *ngIf="userType === 'add'">
         <label class="col-sm-4 col-form-label">{{'DOMAIN' | translate}} {{'NAME' | translate}}</label>
         <div class="col-sm-8">
           <ng-select [clearable]="false" placeholder="{{'SELECT' | translate}}" [items]="domains" bindLabel="title"
index 3520b4e..fc31506 100644 (file)
@@ -57,4 +57,7 @@
     @include padding-value(0, 0, 0, 10);
     @include margin-value(0, 0, 10, 0);
     @include font(null, 11px, null);
+}
+.mandatory-label {
+    margin-left: 10px;
 }
\ No newline at end of file
index 2931d79..a816c62 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Add Edit Component.
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -29,7 +28,7 @@ import { AuthenticationService } from 'AuthenticationService';
 import { APIURLHEADER, ERRORDATA, LOGINPARAMS, MODALCLOSERESPONSEDATA, TYPESECTION } from 'CommonModel';
 import { environment } from 'environment';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 
 /**
  * Creating component
index 31f71e4..477549c 100644 (file)
@@ -29,7 +29,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     <i class="fas fa-plus-circle"></i> {{'PAGE.USERS.ADDMAPPINGS' | translate}}</button>
             </div>
         </div>
-        <label class="col-sm-12 col-form-label mandatory-label"
+        <label class="col-sm-12 col-form-label mandatory-label ps-2"
             [ngClass]="{'text-danger': projectRoleForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' |
             translate}}</label>
         <div *ngFor="let params of getControls(); let i = index;" [formGroupName]="i">
@@ -40,8 +40,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                         <div class="col-sm-8 col-md-8">
                             <ng-select placeholder="{{'SELECT' | translate}}" [items]="projects" bindLabel="name"
                                 bindValue="name" formControlName="project_name" id="project_{{i}}"
-                                [ngClass]="{ 'is-invalid': submitted && params.controls.project_name.errors }">
-                            </ng-select>
+                                [ngClass]="{ 'is-invalid': submitted && params.controls.project_name.errors }"></ng-select>
                         </div>
                         <label class="col-sm-3 col-md-3 col-form-label" for="roles_{{i}}">{{'ROLES' |
                             translate}}*</label>
@@ -52,16 +51,16 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                         </div>
                         <div class="col-sm-1"
                             *ngIf="userDetails.project_role_mappings[i] ? userDetails.project_role_mappings[i].project_name === '' : true">
-                            <button class="button-xs" type="button" class="close" (click)="removeMapping(i)"
+                            <button class="button-xs" type="button" class="delete" (click)="removeMapping(i)"
                                 placement="right" ngbTooltip="{{ 'CANCEL' | translate }}">
                                 <i class="fas fa-minus-circle text-danger"></i>
                             </button>
                         </div>
                         <div class="col-sm-1"
                             *ngIf="userDetails.project_role_mappings[i] ? userDetails.project_role_mappings[i].project_name !== '' : false">
-                            <button class="button-xs" type="button" class="close"
-                                (click)="deleteProjectAndRoleMapping(userDetails.project_role_mappings[i])" placement="right" 
-                                ngbTooltip="{{ 'DELETE' | translate }}">
+                            <button class="button-xs" type="button" class="delete"
+                                (click)="deleteProjectAndRoleMapping(userDetails.project_role_mappings[i])"
+                                placement="right" ngbTooltip="{{ 'DELETE' | translate }}">
                                 <i class="fas fa-trash-alt text-danger"></i>
                             </button>
                         </div>
index c80a776..09ff918 100644 (file)
 }
 
 .col-sm-1{
- bottom: 10px;
-}
\ No newline at end of file
+  position: relative;
+  bottom: 10px;
+}
+.modal-body .row{
+  margin-bottom: 0px;
+}
+.delete{
+  position: absolute;
+  bottom: 8px;
+  left: 3px;
+  border: 0;
+  font-size: 1.3125rem;
+  background-color: transparent;
+}
index 49661cb..985d64f 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
   <div class="d-flex align-items-center header-style">{{'PAGE.DASHBOARD.USERS' | translate}}</div>
   <span class="button">
     <button class="btn btn-primary" type="button" (click)="composeUser()" placement="top" container="body"
@@ -25,8 +25,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </button>
   </span>
 </div>
-<div class="row mt-2 mb-0 form-group justify-content-end list-utilites-actions">
-  <div *ngIf="isAdminShow" class="col-auto mr-auto">
+<div class="mt-2 mb-2 form-group justify-content-end list-utilites-actions">
+  <div *ngIf="isAdminShow" class="col-auto me-auto">
     <nav class="custom-items-config">
       <span><i class="fas fa-user-check text-success"></i>{{userActive}}</span>
       <span><i class="fas fa-user-lock text-danger"></i>{{userLocked}}</span>
@@ -34,7 +34,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
       <span><i class="fas fa-user-shield text-info"></i>{{userAlwaysActive}}</span>
     </nav>
   </div>
-  <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+  <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
   <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index c56f43a..65ef878 100644 (file)
@@ -19,7 +19,6 @@
 /**
  * @file users details Component.
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, OnDestroy, OnInit } from '@angular/core';
 import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
 import { TranslateService } from '@ngx-translate/core';
@@ -31,7 +30,7 @@ import { LocalDataSource } from 'ng2-smart-table';
 import { ProjectService } from 'ProjectService';
 import { RestService } from 'RestService';
 import { Subscription } from 'rxjs';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { UserData, UserDetail } from 'UserModel';
 import { UsersActionComponent } from 'UsersActionComponent';
 
index 0d66e0f..1067054 100644 (file)
@@ -23,7 +23,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </button>
   </div>
   <div class="modal-body">
-    <div class="form-group row">
+    <div class="form-group row mb-3">
       <label class="col-sm-12 col-form-label mandatory-label" [ngClass]="{'text-danger': packagesForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
       <label class="col-sm-6 col-form-label">{{'PACKAGE' | translate}} {{'NAME' | translate}}*</label>
       <div class="col-sm-6">
index 92a2726..3594a37 100644 (file)
@@ -50,7 +50,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
       <i class="fas fa-times-circle text-danger"></i>
     </button>
   </div>
-  <div class="modal-body">
+  <div class="modal-body ms-2">
     <span *ngIf="topologyType === 'Delete'">{{'DELETECONFIRMPOPUPMESSAGE' | translate}} <b>{{ topologyname }}</b> ?</span>
     <ul *ngIf="topologyType === 'Info'">
       <li>
index f099af1..30ae5e0 100644 (file)
@@ -15,34 +15,34 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="form-group row">
-  <div class="d-flex align-items-center header-style">{{'EDIT' | translate}}&nbsp;<span
+<div class="form-group row mb-3">
+  <div class="d-flex align-items-center header-style p-0">{{'EDIT' | translate}}&nbsp;<span
       class="text-uppercase">{{pacakgeType}}&nbsp;</span>{{'DESCRIPTOR' | translate}}</div>
 </div>
 <form *ngIf="defaults[mode]">
-  <div class="row">
+  <div class="row mb-2">
     <div class="col-2">
       <div class="form-group">
-        <select class="form-control custom-select" name="state" [(ngModel)]="mode" (ngModelChange)="changeMode()">
+        <select class="form-control select" name="state" [(ngModel)]="mode" (ngModelChange)="changeMode()">
           <option *ngFor="let types of fileTypes;" [value]="types.value">
             {{types.viewValue}}</option>
         </select>
       </div>
     </div>
     <div class="col-4">
-      <div class="btn-group-toggle mb-1 mr-1 float-left">
+      <div class="btn-group-toggle mb-1 me-1 float-start">
         <label class="btn btn-light" [class.active]="readOnly">
-          <input type="checkbox" [(ngModel)]="readOnly" name="readOnly" autocomplete="off">
+          <input class="checkbox d-none" type="checkbox" [(ngModel)]="readOnly" name="readOnly" autocomplete="off">
           {{'READONLYMODE' | translate}} ({{'CURRENTLY' | translate}} {{ (readOnly ? 'ON' : 'OFF') | translate }})
         </label>
       </div>
     </div>
-    <div class="col-6 text-right">
-      <button type="button" class="btn btn-primary mr-2" routerLink="/packages/{{navigatePath}}/compose/{{paramsID}}"
+    <div class="col-6 text-end">
+      <button type="button" class="btn btn-primary me-2" routerLink="/packages/{{navigatePath}}/compose/{{paramsID}}"
         [hidden]="navigatePath==='netslice'">
         <i class="fa fa-sitemap" aria-hidden="true"></i>&nbsp;{{'SHOWGRAPH' | translate}}
       </button>
-      <button type="button" class="btn btn-primary mr-2" (click)="update(true)" [hidden]="navigatePath==='netslice'">
+      <button type="button" class="btn btn-primary me-2" (click)="update(true)" [hidden]="navigatePath==='netslice'">
         <i class="fa fa-save" aria-hidden="true"></i>&nbsp;{{'UPDATESHOWGRAPH' | translate}}
       </button>
       <button type="button" class="btn btn-primary" (click)="update(false)">
index 5a9c483..3844392 100644 (file)
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 */
-.ngx-codemirror {
-    font-size: 14px;
+@use "sass:math";
+@import "/src/assets/scss/mixins/mixin.scss";
+@import "/src/assets/scss/variable.scss";
+.btn.active {
+    color: $gray-900;
+    background-color: $paleblue;
+    border-color: $paleblue;
+}
+.btn-light:hover {
+    color: $gray-900;
+    background-color: $paleblue;
+    border-color: $paleblue;
+}
+select.form-control {
+    background-color: $white !important;
+    padding: 0.375rem 1.75rem 0.375rem 0.75rem;
+    @include flexbox(inline-block, null, null, null, null, null);
+    vertical-align: middle;
+    background: $white
+        url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E")
+        no-repeat right 0.75rem center;
+    background-size: 8px 10px;
+    @include border(all, 1, solid, $gray-200);
+    @include roundedCorners(2);
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    appearance: none;
+    &::-ms-expand {
+        visibility: hidden;
+    }
 }
\ No newline at end of file
diff --git a/src/app/utilities/healing/HealingComponent.html b/src/app/utilities/healing/HealingComponent.html
new file mode 100644 (file)
index 0000000..84c413a
--- /dev/null
@@ -0,0 +1,107 @@
+<!--
+Copyright 2020 TATA ELXSI
+
+Licensed under the Apache License, Version 2.0 (the 'License');
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
+-->
+<div class="modal-header">
+    <h4 class="modal-title" id="modal-basic-title">{{ 'HEALING' | translate }}</h4>
+    <button class="button-xs" type="button" class="close" aria-label="Close" (click)="activeModal.close()">
+        <i class="fas fa-times-circle text-danger"></i>
+    </button>
+</div>
+<form [formGroup]="healingForm" (ngSubmit)="manualHealingTrigger()" autocomplete="off">
+    <div class="modal-body">
+        <div class="form-group row mb-3">
+            <label class="col-sm-12 col-form-label mandatory-label"
+                [ngClass]="{'text-danger': healingForm.invalid === true && submitted === true}">
+                {{'MANDATORYCHECK' | translate}}
+            </label>
+            <div class="col-sm-6">
+                <label for="memberVnfIndex"> {{'MEMBERVNFINDEX' | translate}} *</label>
+            </div>
+            <div class="col-sm-6">
+                <ng-select (change)="getVdu($event.vnfinstanceId)" formControlName="memberIndex" [clearable]="false"
+                    placeholder="{{'SELECTMEMBERVNFINDEX' | translate}} *" [items]="memberTypes" bindLabel="id" bindValue="id"
+                    [ngClass]="{ 'is-invalid': submitted && f.memberIndex.errors }">
+                </ng-select>
+                <small class="form-text text-muted" *ngIf="selectedvnfId !== ''">vnfd-id : {{ selectedvnfId }}</small>
+            </div>
+        </div>
+        <div class="form-group row mb-3">
+            <div class="col-sm-6">
+                <label for="memberVnfIndex"> {{'DAY1OPERATION' | translate}}</label>
+            </div>
+            <div class="col-sm-6">
+                <ng-select formControlName="run_day1" [clearable]="false" placeholder="{{'DAY1OPERATION' | translate}}"
+                    [items]="day1Operation" bindLabel="name" bindValue="id">
+                </ng-select>
+            </div>
+        </div>
+        <div class="form-group row p-2 bg-light text-white justify-content-end" mb-3>
+            <div class="col-5 text-end">
+                <button class="button-xs" type="button" class="btn btn-primary" (click)="addVdu()">
+                    <i class="fas fa-plus-circle"></i>{{'SELECTVDU' | translate}}</button>
+            </div>
+        </div>
+        <ng-container>
+            <div formArrayName="vdu" *ngFor="let params of getControls(); let i = index;">
+                <div class="form-group row" [formGroupName]="i">
+                    <div class="card bg-light">
+                        <div class="card-body">
+                            <div class="form-group row mb-3">
+                                <label class="col-sm-3 col-md-3 col-form-label ps-0" for="vduId_{{i}}">{{'VDUID' |
+                                    translate}}</label>
+                                <div class="col-sm-8 col-md-8 ps-1">
+                                    <ng-select (change)="getCountIndex($event.VDU)"
+                                        placeholder="{{'SELECT' | translate}}" [items]="vduId" bindLabel="VDU"
+                                        bindValue="VDU" formControlName="vduId" id="vduId_{{i}}"
+                                        [ngClass]="{ 'is-invalid': submitted && params.controls.vduId.errors }">
+                                    </ng-select>
+                                </div>
+                                <label class="col-sm-3 col-md-3 col-form-label ps-0" for="countIndex_{{i}}">{{'COUNTINDEX' |
+                                    translate}}</label>
+                                <div class="col-sm-8 col-md-8 ps-1">
+                                    <ng-select placeholder="{{'SELECT' | translate}}" [items]="countIndex"
+                                        bindLabel="count-index" bindValue="count-index" formControlName="countIndex"
+                                        id="countIndex_{{i}}"
+                                        [ngClass]="{ 'is-invalid': submitted && params.controls.countIndex.errors }">
+                                    </ng-select>
+                                </div>
+                                <label class="col-sm-3 col-md-3 col-form-label ps-0" for="runDay1_{{i}}">{{'DAY1OPERATION' |
+                                    translate}}</label>
+                                <div class="col-sm-8 col-md-8 ps-1">
+                                    <ng-select formControlName="runDay1" [clearable]="false" placeholder="{{'DAY1OPERATION' |
+                                translate}}" [items]="day1Operation" bindLabel="name" bindValue="id">
+                                    </ng-select>
+                                </div>
+                                <div class="col-sm-1">
+                                    <button class="button-xs" type="button" class="remove-mapping close" (click)="removeMapping(i)"
+                                        placement="right" ngbTooltip="{{ 'CANCEL' | translate }}">
+                                        <i class="fas fa-minus-circle text-danger"></i>
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </ng-container>
+    </div>
+    <div class="modal-footer">
+        <button type="button" (click)="activeModal.close()" class="btn btn-danger">{{'CANCEL' | translate}}</button>
+        <button type="submit" class="btn btn-primary">{{'APPLY' | translate }}</button>
+    </div>
+</form>
+<app-loader [waitingMessage]="message" *ngIf="isLoadingResults"></app-loader>
\ No newline at end of file
diff --git a/src/app/utilities/healing/HealingComponent.scss b/src/app/utilities/healing/HealingComponent.scss
new file mode 100644 (file)
index 0000000..a801a0a
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ Copyright 2020 TATA ELXSI
+
+ Licensed under the Apache License, Version 2.0 (the 'License');
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
+*/
+.remove-mapping {
+   top: 50px;
+}
+.modal-body .row {
+   margin-bottom: 1px;
+ }
diff --git a/src/app/utilities/healing/HealingComponent.ts b/src/app/utilities/healing/HealingComponent.ts
new file mode 100644 (file)
index 0000000..6360c48
--- /dev/null
@@ -0,0 +1,299 @@
+/*
+ Copyright 2020 TATA ELXSI
+
+ Licensed under the Apache License, Version 2.0 (the 'License');
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
+*/
+/**
+ * @file Healing Component
+ */
+import { HttpHeaders } from '@angular/common/http';
+import { Component, Injector, Input, OnInit } from '@angular/core';
+import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
+import { Router } from '@angular/router';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { TranslateService } from '@ngx-translate/core';
+import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, URLPARAMS } from 'CommonModel';
+import { environment } from 'environment';
+import { VDUMAP, VDUMAPPINGS } from 'NSInstanceModel';
+import { RestService } from 'RestService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
+import { InstanceData, VDUR, VNFInstanceDetails } from 'VNFInstanceModel';
+/**
+ * Creating component
+ * @Component takes HealingComponent.html as template url
+ */
+@Component({
+    selector: 'app-healing',
+    templateUrl: './HealingComponent.html',
+    styleUrls: ['./HealingComponent.scss']
+})
+export class HealingComponent implements OnInit {
+    /** To inject services @public */
+    public injector: Injector;
+    /** Instance for active modal service @public */
+    public activeModal: NgbActiveModal;
+    /** Check the loading results @public */
+    public isLoadingResults: Boolean = false;
+    /** Give the message for the loading @public */
+    public message: string = 'PLEASEWAIT';
+    /** Member index of the NS @public */
+    public memberVNFIndex: {}[] = [];
+    /** Items for the memberVNFIndex @public */
+    public memberTypes: {}[];
+    /** Items for the Day1 operation  @public */
+    public day1Operation: {}[];
+    /** Items for the vdu-Id and count-index @public */
+    public vdu: {}[];
+    /** Selected VNFInstanceId @public */
+    public selectedvnfId: string = '';
+    /** Contains vduId @public */
+    public vduId: {};
+    /** VDU Mapping @public */
+    public vduMap: VDUMAP = {};
+    /** Items for countIndex @public */
+    public countIndex: {}[];
+    /** Contains vnfInstanceId of the selected MemberVnfIndex  @public */
+    public instanceId: string;
+    /** FormGroup instance added to the form @ html @public */
+    public healingForm: FormGroup;
+    /** Form valid on submit trigger @public */
+    public submitted: boolean = false;
+    /** VDU Form array @private */
+    private vduFormArray: FormArray;
+    /** Array holds VNFR Data filtered with nsr ID @private */
+    private nsIdFilteredData: {}[] = [];
+    /** FormBuilder instance added to the formBuilder @private */
+    private formBuilder: FormBuilder;
+    /** Instance of the rest service @private */
+    private restService: RestService;
+    /** Controls the header form @private */
+    private headers: HttpHeaders;
+    /** Contains tranlsate instance @private */
+    private translateService: TranslateService;
+    /** Input contains component objects @private */
+    @Input() private params: URLPARAMS;
+    /** Contains all methods related to shared @private */
+    private sharedService: SharedService;
+    /** Holds teh instance of AuthService class of type AuthService @private */
+    private router: Router;
+
+    constructor(injector: Injector) {
+        this.injector = injector;
+        this.restService = this.injector.get(RestService);
+        this.activeModal = this.injector.get(NgbActiveModal);
+        this.translateService = this.injector.get(TranslateService);
+        this.formBuilder = this.injector.get(FormBuilder);
+        this.sharedService = this.injector.get(SharedService);
+        this.router = this.injector.get(Router);
+    }
+
+    /** convenience getter for easy access to form fields */
+    get f(): FormGroup['controls'] { return this.healingForm.controls; }
+
+    /**
+     * Lifecyle Hooks the trigger before component is instantiate
+     */
+    public ngOnInit(): void {
+        this.initializeForm();
+        this.getmemberIndex();
+        this.day1Operation = [
+            { id: 'true', name: this.translateService.instant('True') },
+            { id: '', name: this.translateService.instant('False') }
+        ];
+        this.headers = new HttpHeaders({
+            'Content-Type': 'application/json',
+            Accept: 'application/json',
+            'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0'
+        });
+    }
+
+    /** Generate primitive params @public */
+    get vduParamsBuilder(): FormGroup {
+        return this.formBuilder.group({
+            vduId: [null],
+            countIndex: [null],
+            runDay1: [null]
+        });
+    }
+
+    /** Initialize Healing Forms @public */
+    public initializeForm(): void {
+        this.healingForm = this.formBuilder.group({
+            memberIndex: [null, [Validators.required]],
+            run_day1: [null],
+            vdu: this.formBuilder.array([])
+        });
+    }
+
+    /** Handle FormArray Controls @public */
+    public getControls(): AbstractControl[] {
+        return (this.healingForm.get('vdu') as FormArray).controls;
+    }
+
+    /** Get the member-vnf-index from NS Package -> vnf-profile @private */
+    private getmemberIndex(): void {
+        this.isLoadingResults = true;
+        const vnfInstanceData: {}[] = [];
+        this.restService.getResource(environment.VNFINSTANCES_URL).subscribe((vnfInstancesData: VNFInstanceDetails[]): void => {
+            vnfInstancesData.forEach((vnfData: VNFInstanceDetails): void => {
+                const nsrId: string = 'nsr-id-ref';
+                const memberIndex: string = 'member-vnf-index-ref';
+                const vnfDataObj: {} =
+                {
+                    VNFInstanceId: vnfData._id,
+                    // eslint-disable-next-line security/detect-object-injection
+                    MemberIndex: vnfData[memberIndex],
+                    // eslint-disable-next-line security/detect-object-injection
+                    NS: vnfData[nsrId]
+                };
+                vnfInstanceData.push(vnfDataObj);
+            });
+            const nsId: string = 'NS';
+            // eslint-disable-next-line security/detect-object-injection
+            this.nsIdFilteredData = vnfInstanceData.filter((vnfdData: {}[]): boolean => vnfdData[nsId] === this.params.id);
+            this.nsIdFilteredData.forEach((resVNF: InstanceData): void => {
+                const assignMemberIndex: {} = {
+                    id: resVNF.MemberIndex,
+                    vnfinstanceId: resVNF.VNFInstanceId
+                };
+                this.memberVNFIndex.push(assignMemberIndex);
+            });
+            this.memberTypes = this.memberVNFIndex;
+            this.isLoadingResults = false;
+        }, (error: ERRORDATA): void => {
+            this.restService.handleError(error, 'get');
+            this.isLoadingResults = false;
+        });
+    }
+
+    /** Getting vdu-id & count-index from VNFInstance API */
+    public getVdu(id: string): void {
+        this.isLoadingResults = true;
+        this.vdu = [];
+        const vnfInstanceData: {}[] = [];
+        this.instanceId = id;
+        if (!isNullOrUndefined(id)) {
+            this.restService.getResource(environment.VNFINSTANCES_URL + '/' + id).
+                subscribe((vnfInstanceDetail: VNFInstanceDetails): void => {
+                    this.selectedvnfId = vnfInstanceDetail['vnfd-ref'];
+                    if (!isNullOrUndefined(vnfInstanceDetail.vdur)) {
+                        vnfInstanceDetail.vdur.forEach((vdu: VDUR): void => {
+                            const vnfInstanceDataObj: {} =
+                            {
+                                'count-index': vdu['count-index'],
+                                VDU: vdu['vdu-id-ref']
+                            };
+                            vnfInstanceData.push(vnfInstanceDataObj);
+                        });
+                        this.vdu = vnfInstanceData;
+                        this.vduId = this.vdu.filter((vdu: { VDU?: string }, index: number, self: {}[]): {} =>
+                            index === self.findIndex((t: { VDU?: string }): {} => (
+                                // eslint-disable-next-line security/detect-object-injection
+                                t.VDU === vdu.VDU
+                            ))
+                        );
+                        this.isLoadingResults = false;
+                    }
+                }
+                    , (error: ERRORDATA): void => {
+                        this.restService.handleError(error, 'get');
+                        this.isLoadingResults = false;
+                    });
+        }
+    }
+
+    /** Getting count-index by filtering id  */
+    public getCountIndex(id: string): void {
+        const VDU: string = 'VDU';
+        // eslint-disable-next-line security/detect-object-injection
+        this.countIndex = this.vdu.filter((vnfdData: {}[]): boolean => vnfdData[VDU] === id);
+    }
+
+
+    /** Add vdu @public */
+    public addVdu(): void {
+        this.vduFormArray = this.healingForm.get('vdu') as FormArray;
+        this.vduFormArray.push(this.vduParamsBuilder);
+    }
+
+    /** Remove vdu @public */
+    public removeMapping(index: number): void {
+        this.vduFormArray.removeAt(index);
+    }
+
+    /** If form is valid and call healInstances method to initialize healing @public */
+    public manualHealingTrigger(): void {
+        this.submitted = true;
+        let healingPayload: object = {};
+        this.sharedService.cleanForm(this.healingForm);
+        if (this.healingForm.invalid) { return; } // Proceed, onces form is valid
+        this.vduMap.vdu_mappings = [];
+        this.healingForm.value.vdu.forEach((res: VDUMAPPINGS): void => {
+            this.vduMap.vdu_mappings.push({ 'vdu-id': res.vduId, 'count-index': res.countIndex, 'run-day1': Boolean(res.runDay1) });
+        });
+        if (this.vduMap.vdu_mappings.length !== 0) {
+            healingPayload = {
+                healVnfData:
+                    [{
+                        vnfInstanceId: this.instanceId,
+                        cause: 'manual',
+                        additionalParams: {
+                            'run-day1': false,
+                            vdu: this.vduMap.vdu_mappings
+                        }
+                    }]
+            };
+        } else {
+            healingPayload = {
+                healVnfData:
+                    [{
+                        vnfInstanceId: this.instanceId,
+                        cause: 'manual',
+                        additionalParams: {
+                            'run-day1': Boolean(this.getFormControl('run_day1').value)
+                        }
+                    }]
+            };
+        }
+        this.healInstances(healingPayload);
+    }
+
+    /** Initialize the healing @public */
+    public healInstances(healingPayload: object): void {
+        this.isLoadingResults = true;
+        const apiURLHeader: APIURLHEADER = {
+            url: environment.NSDINSTANCES_URL + '/' + this.params.id + '/heal',
+            httpOptions: { headers: this.headers }
+        };
+        const modalData: MODALCLOSERESPONSEDATA = {
+            message: 'Done'
+        };
+        this.restService.postResource(apiURLHeader, healingPayload).subscribe((result: {}): void => {
+            this.activeModal.close(modalData);
+            this.router.navigate(['/instances/ns/history-operations/' + this.params.id]).catch((): void => {
+                // Catch Navigation Error
+            });
+        }, (error: ERRORDATA): void => {
+            this.restService.handleError(error, 'post');
+            this.isLoadingResults = false;
+        });
+    }
+
+    /** Used to get the AbstractControl of controlName passed @private */
+    private getFormControl(controlName: string): AbstractControl {
+        // eslint-disable-next-line security/detect-object-injection
+        return this.healingForm.controls[controlName];
+    }
+}
index 517dbde..6a32735 100644 (file)
@@ -70,6 +70,10 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 placement="left" data-container="body" ngbTooltip="{{'SCALING' | translate}}">
                 <i class="fas fa-cubes"></i> {{'SCALING' | translate}}
             </button>
+            <button type="button" class="btn btn-primary dropdown-item" [disabled]="operationalStatus === 'healing' || operationalStatus === 'failed' || configStatus === 'failed'" (click)="openHealing()" 
+                placement="left" data-container="body" ngbTooltip="{{'HEALING' | translate}}">
+                <i class="fas fa-user-md"></i> {{'HEALING' | translate}}
+            </button>
             <button type="button" class="btn btn-primary dropdown-item" (click)="openNsUpdate()" placement="left" data-container="body"
                 [disabled]="operationalStatus === 'failed' || configStatus === 'failed'" ngbTooltip="{{'NSUPDATE' | translate}}">
                 <i class="fas fa-arrow-alt-circle-up"></i> {{'NSUPDATE' | translate}}
index ea7fa61..1582bc4 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file NS InstancesAction Component
  */
-import { isNullOrUndefined } from 'util';
 import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector } from '@angular/core';
 import { Router } from '@angular/router';
 import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
@@ -27,6 +26,7 @@ import { NotifierService } from 'angular-notifier';
 import { ERRORDATA, MODALCLOSERESPONSEDATA } from 'CommonModel';
 import { DeleteComponent } from 'DeleteComponent';
 import { environment } from 'environment';
+import { HealingComponent } from 'HealingComponent';
 import { NSDDetails } from 'NSDModel';
 import { NSDInstanceData } from 'NSInstanceModel';
 import { NSPrimitiveComponent } from 'NSPrimitiveComponent';
@@ -34,7 +34,7 @@ import { NsUpdateComponent } from 'NsUpdateComponent';
 import { RestService } from 'RestService';
 import { forkJoin, Observable } from 'rxjs';
 import { ScalingComponent } from 'ScalingComponent';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { ShowInfoComponent } from 'ShowInfoComponent';
 import { StartStopRebuildComponent } from 'StartStopRebuildComponent';
 import { VerticalScalingComponent } from 'VerticalScalingComponent';
@@ -170,7 +170,7 @@ export class NSInstancesActionComponent {
       }
     }).catch((): void => {
       // Catch Navigation Error
-  });
+    });
   }
 
   /** History of operations for an Instanace @public */
@@ -285,7 +285,7 @@ export class NSInstancesActionComponent {
       }
     }).catch((): void => {
       // Catch Navigation Error
-  });
+    });
   }
 
   /** To open VM Migration in NS Instances */
@@ -301,7 +301,7 @@ export class NSInstancesActionComponent {
       }
     }).catch((): void => {
       // Catch Navigation Error
-  });
+    });
   }
 
   /** To open the Ns Update pop-up */
@@ -317,7 +317,7 @@ export class NSInstancesActionComponent {
       }
     }).catch((): void => {
       // Catch Navigation Error
-  });
+    });
   }
 
   /** To open the Start, Stop & Rebuild pop-up */
@@ -341,7 +341,7 @@ export class NSInstancesActionComponent {
       }
     }).catch((): void => {
       // Catch Navigation Error
-  });
+    });
   }
 
   /** To open the vertical Scaling pop-up */
@@ -357,7 +357,23 @@ export class NSInstancesActionComponent {
       }
     }).catch((): void => {
       // Catch Navigation Error
-  });
+    });
+  }
+
+  /** Open the Healing pop-up @public */
+  public openHealing(): void {
+    // eslint-disable-next-line security/detect-non-literal-fs-filename
+    const modalRef: NgbModalRef = this.modalService.open(HealingComponent, { backdrop: 'static' });
+    modalRef.componentInstance.params = {
+      id: this.instanceID
+    };
+    modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
+      if (result) {
+        this.sharedService.callData();
+      }
+    }).catch((): void => {
+      // Catch Navigation Error
+    });
   }
 
   /**
index 2c98599..337c283 100644 (file)
@@ -23,7 +23,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
 </div>
 <form [formGroup]="nsUpdateForm" (ngSubmit)="triggerNsUpdate()" autocomplete="off">
     <div class="modal-body">
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-12 col-form-label mandatory-label"
                 [ngClass]="{'text-danger': nsUpdateForm.invalid === true && submitted === true}">
                 {{'MANDATORYCHECK' | translate}}
@@ -37,19 +37,19 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
                     [ngClass]="{ 'is-invalid': submitted && f.updateType.errors }"></ng-select>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-6">
                 <label for="memberVnfIndex"> {{'MEMBERVNFINDEX' | translate}} *</label>
             </div>
             <div class="col-sm-6">
-                <ng-select formControlName="memberVnfIndex" [clearable]="false" [(ngModel)]="memberIndexValue" (change) = 'getSelectedVNF($event.vnfinstanceId)'
-                    placeholder="{{'SELECTMEMBERVNFINDEX' | translate}}" [items]="memberTypes" bindLabel="id"
-                    bindValue="id" [ngClass]="{ 'is-invalid': submitted && f.memberVnfIndex.errors }">
+                <ng-select formControlName="memberVnfIndex" [clearable]="false" [(ngModel)]="memberIndexValue" (change)='getSelectedVNF($event.vnfinstanceId)'
+                    placeholder="{{'SELECTMEMBERVNFINDEX' | translate}}" [items]="memberTypes"
+                    bindLabel="id" bindValue="id" [ngClass]="{ 'is-invalid': submitted && f.memberVnfIndex.errors }">
                 </ng-select>
                 <small class="form-text text-muted" *ngIf="selectedvnfId !== ''">vnfd : {{ selectedvnfId }}</small>
             </div>
         </div>
-        <div class="form-group row" *ngIf="!vnfdIdShow">
+        <div class="form-group row mb-3" *ngIf="!vnfdIdShow">
             <div class="col-sm-6">
                 <label for="vnfdId"> {{'VNFDNAME' | translate}} *</label>
             </div>
index 7efba70..724bba3 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Ns Update Component
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -29,7 +28,7 @@ import { APIURLHEADER, CONFIGCONSTANT, ERRORDATA, MODALCLOSERESPONSEDATA, URLPAR
 import { environment } from 'environment';
 import { NSUPDATE, TERMINATEVNF } from 'NSInstanceModel';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { VNFD } from 'VNFDModel';
 import { InstanceData, VNFInstanceDetails } from 'VNFInstanceModel';
 import { WarningComponent } from 'WarningComponent';
index a63ebb4..1bab5d5 100644 (file)
@@ -16,7 +16,7 @@ limitations under the License.
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
 <div class="page-per-row">
-  <label class="mr-2 mt-2">
+  <label class="me-2">
     <b>{{'ENTRIES' | translate}}</b>
   </label>
   <select class="form-control custom-select" (change)="onSelectRow($event.target.value)">
index 3f193c2..6f0ab70 100644 (file)
@@ -20,7 +20,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         <button type="button" class="btn btn-primary dropdown-toggle action-button" ngbDropdownToggle>
             {{'ACTION' | translate}}
         </button>
-        <div class="dropdown-menu list-action-dropdown" ngbDropdownMenu>
+        <div class="dropdown-menu list-action-dropdown mt-1" ngbDropdownMenu>
             <button type="button" class="btn btn-primary dropdown-item" (click)="projectEdit()" placement="left"
                 container="body" ngbTooltip="{{'EDIT' | translate}}">
                 <i class="fa fa-edit icons"></i> {{'EDIT' | translate}}
index 522ba83..1487a7c 100644 (file)
@@ -20,7 +20,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
       <button type="button" class="btn btn-primary dropdown-toggle action-button" ngbDropdownToggle>
           {{'ACTION' | translate}}
       </button>
-      <div class="dropdown-menu list-action-dropdown" ngbDropdownMenu>
+      <div class="dropdown-menu list-action-dropdown mt-1" ngbDropdownMenu>
           <button type="button" class="btn btn-primary dropdown-item" (click)="editRole()" placement="left"
               container="body" ngbTooltip="{{'EDIT' | translate}}">
               <i class="fa fa-edit icons"></i> {{'EDIT' | translate}}
index 803a320..fa6b960 100644 (file)
@@ -23,21 +23,21 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
 </div>
 <form [formGroup]="scalingForm" (ngSubmit)="manualScalingTrigger()" autocomplete="off">
     <div class="modal-body">
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-12 col-form-label mandatory-label"
                 [ngClass]="{'text-danger': scalingForm.invalid === true && submitted === true}">
                 {{'MANDATORYCHECK' | translate}}
             </label>
             <div class="col-sm-12">
                 <ng-select formControlName="memberIndex" [clearable]="false"
-                    (change)="getScalingGroupDescriptorName($event.vnfdRef)" placeholder="Select Member VNF Index *"
+                    (change)="getScalingGroupDescriptorName($event.vnfdRef)" placeholder="{{'SELECTMEMBERVNFINDEX' | translate}} *"
                     [items]="memberTypes" bindLabel="id" bindValue="id"
                     [ngClass]="{ 'is-invalid': submitted && f.memberIndex.errors }">
                 </ng-select>
                 <small class="form-text text-muted" *ngIf="selectedVNFID !== ''">vnfd-id : {{ selectedVNFID }}</small>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-12">
                 <ng-select formControlName="scalingname" [clearable]="false" placeholder="Select scaling-aspect *"
                     [items]="scalingGroup" bindLabel="name" bindValue="id"
@@ -45,7 +45,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </ng-select>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-12">
                 <ng-select formControlName="scaleType" [clearable]="false" placeholder="Select Scale Type *"
                     [items]="scaleTypes" bindLabel="name" bindValue="id"
index be15660..46a257d 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Scaling Component
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -28,7 +27,7 @@ import { TranslateService } from '@ngx-translate/core';
 import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, URLPARAMS } from 'CommonModel';
 import { environment } from 'environment';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { DF, SCALING, VNFD } from 'VNFDModel';
 import { InstanceData, VNFInstanceDetails } from 'VNFInstanceModel';
 /**
index 9940129..aed0444 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file StartStopRebuild Component
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -28,7 +27,7 @@ import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, URLPARAMS } from 'Comm
 import { environment } from 'environment';
 import { StartStopRebuild } from 'NSInstanceModel';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { DF, VNFD } from 'VNFDModel';
 import { InstanceData, VDUR, VNFInstanceDetails } from 'VNFInstanceModel';
 
index c108655..69bf2ab 100644 (file)
@@ -20,7 +20,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         <button type="button" class="btn btn-primary dropdown-toggle action-button" ngbDropdownToggle>
             {{'ACTION' | translate}}
         </button>
-        <div class="dropdown-menu list-action-dropdown" ngbDropdownMenu>
+        <div class="dropdown-menu list-action-dropdown mt-1" ngbDropdownMenu>
             <button *ngIf="isAdminShow" type="button" class="btn btn-primary dropdown-item" (click)="editUserModal('editPassword')"
                 placement="left" container="body" ngbTooltip="{{'PAGE.USERS.EDITCREDENTIALS' | translate}}">
                 <i class="fa fa-edit icons"></i> {{'PAGE.USERS.EDITCREDENTIALS' | translate}}
index 799779d..a7b4c24 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Users Action Component
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector } from '@angular/core';
 import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
 import { TranslateService } from '@ngx-translate/core';
@@ -26,7 +25,7 @@ import { AddEditUserComponent } from 'AddEditUserComponent';
 import { MODALCLOSERESPONSEDATA } from 'CommonModel';
 import { DeleteComponent } from 'DeleteComponent';
 import { ProjectRoleComponent } from 'ProjectRoleComponent';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { UserData } from 'UserModel';
 import { WarningComponent } from 'WarningComponent';
 /**
index 5525871..eddf226 100644 (file)
@@ -23,7 +23,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
 </div>
 <form [formGroup]="scalingForm" (ngSubmit)="triggerVerticalScaling()" autocomplete="off">
     <div class="modal-body">
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-12 col-form-label mandatory-label"
                 [ngClass]="{'text-danger': scalingForm.invalid === true && submitted === true}">
                 {{'MANDATORYCHECK' | translate}}
@@ -39,7 +39,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
                 <small class="form-text text-muted" *ngIf="selectedvnfId !== ''">vnfd-id : {{ selectedvnfId }}</small>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-6">
                 <label for="vdu-id"> {{'VDUID' | translate}} *</label>
             </div>
@@ -50,7 +50,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
                 </ng-select>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-6">
                 <label for="count-index"> {{'COUNTINDEX' | translate}} *</label>
             </div>
@@ -62,7 +62,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
                 </ng-select>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-6">
                 <label for="memoryMB"> {{'MEMORYMB' | translate}} *</label>
             </div>
@@ -72,7 +72,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
                     [ngClass]="{ 'is-invalid': submitted && f.virtualMemory.errors }">
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-6">
                 <label for="storageGB"> {{'STORAGEGB' | translate}} *</label>
             </div>
@@ -82,7 +82,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
                     [ngClass]="{ 'is-invalid': submitted && f.sizeOfStorage.errors }">
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-6">
                 <label for="vcpucount"> {{'VCPUCOUNT' | translate}} *</label>
             </div>
index 7b4c087..36ec2fc 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file VerticalScaling Component
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -30,7 +29,7 @@ import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, URLPARAMS } from 'Comm
 import { environment } from 'environment';
 import { VerticalScaling } from 'NSInstanceModel';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { InstanceData, VDUR, VNFInstanceDetails } from 'VNFInstanceModel';
 
 /**
index 1286116..071c341 100644 (file)
@@ -18,7 +18,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
 <div class="btn-group list action" role="group">
     <ng-template #popTitle>
         <span class="text-primary"><strong>{{'PAGE.DASHBOARD.RUNNINGINSTANCES' | translate}}</strong></span>
-        <button class="button-xs close" type="button" (click)="p.close()">
+        <button class="button-xs close-instances" type="button" (click)="p.close()">
             <i class="fas fa-times-circle text-danger"></i>
         </button>
     </ng-template>
@@ -33,7 +33,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </ng-template>
     <ng-template #graphTitle>
         <span class="text-primary"><strong>{{'PAGE.VIMDETAILS.VIMRESOURCES' | translate}}</strong></span>
-        <button class="button-xs close" type="button" (click)="chart.close()">
+        <button class="chart button-xs close" type="button" (click)="chart.close()">
             <i class="fas fa-times-circle text-danger"></i>
         </button>
     </ng-template>
index 021d205..12b851d 100644 (file)
  limitations under the License.
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
-*/
\ No newline at end of file
+*/
+.chart {
+   opacity: 1;
+   background-color: transparent;
+   border: 0;
+   position: absolute;
+   right: 10px;
+   top: 4px;
+   font-size: 1.31rem;
+}
+.list-group-item {
+   background-color: white;
+}
+.close-instances {
+   opacity: 1;
+   background-color: transparent;
+   border: 0;
+   position: absolute;
+   right: 10px;
+   bottom: 62px;
+   font-size: 1.31rem;
+}
\ No newline at end of file
index fa1cd14..ee2078f 100644 (file)
@@ -23,7 +23,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
 </div>
 <form [formGroup]="migrationForm" (ngSubmit)="triggerMigration()" autocomplete="off">
     <div class="modal-body">
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <label class="col-sm-12 col-form-label mandatory-label"
                 [ngClass]="{'text-danger': migrationForm.invalid === true && submitted === true}">
                 {{'MANDATORYCHECK' | translate}}
@@ -39,7 +39,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
                 <small class="form-text text-muted" *ngIf="selectedvnfId !== ''">vnfd-id : {{ selectedvnfId }}</small>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-6">
                 <label for="vduid"> {{'VDUID' | translate}}</label>
             </div>
@@ -50,7 +50,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
                 </ng-select>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-6">
                 <label for="countIndex"> {{'COUNTINDEX' | translate}}</label>
             </div>
@@ -62,7 +62,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
                 </ng-select>
             </div>
         </div>
-        <div class="form-group row">
+        <div class="form-group row mb-3">
             <div class="col-sm-6">
                 <label for="migrateToHost"> {{'MIGRATETOHOST' | translate}}</label>
             </div>
index b629497..27f60e1 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Vm Migration Component
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, Injector, Input, OnInit } from '@angular/core';
 import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -28,7 +27,7 @@ import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, URLPARAMS } from 'Comm
 import { environment } from 'environment';
 import { VMMIGRATION } from 'NSInstanceModel';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { InstanceData, VDUR, VNFInstanceDetails } from 'VNFInstanceModel';
 
 /**
index 92adccb..84ec4af 100644 (file)
@@ -28,7 +28,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
 </div>
 <div class="modal-footer">
     <button (click)="closeModal('close')" class="btn btn-danger">{{'CANCEL' | translate }}</button>
-    <button *ngIf="!action" (click)="closeModal('done')" class="btn btn-success">{{submitMessage}}</button>
-    <button *ngIf="action" (click)="onSubmit()" class="btn btn-success">{{submitMessage}}</button>
+    <button class="btn btn-success text-white"
+        (click)="!action ? closeModal('done') : onSubmit()">{{submitMessage}}</button>
 </div>
 <app-loader [waitingMessage]="message" *ngIf="isLoad"></app-loader>
\ No newline at end of file
index 8c75d25..e25cd44 100644 (file)
@@ -17,10 +17,10 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
 -->
 <div class="row">
     <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
-        <div class="row d-flex flex-row justify-content-between px-3 py-2">
+        <div class="d-flex flex-row justify-content-between px-3 py-2">
             <div class="d-flex align-items-center header-style">{{resourcesData.name}}</div>
             <span class="button">
-                <label class="switch ml-1">
+                <label class="switch ms-1">
                     <input type="checkbox" (change)="changeChartType($event.target.checked)">
                     <div class="slider round">
                         <span class="on">{{ 'PAGE.VIMDETAILS.DOUGHNUT' | translate }}</span>
@@ -30,7 +30,7 @@ Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
             </span>
         </div>
         <ng-container *ngFor="let showData of chartData">
-            <div class="header-style ml-3 mt-2">{{showData.heading}}</div>
+            <div class="header-style ms-2 mt-2 px-3 py-1">{{showData.heading}}</div>
             <div class="row mt-2">
                 <div class="col-xs-{{12/showData.length}} col-sm-{{12/showData.length}} col-md-{{12/showData.length}} col-lg-{{12/showData.length}} col-xl-{{12/showData.length}}"
                     *ngFor="let list of showData.data;let i = index;">
index 1ffd10c..1b694ea 100644 (file)
@@ -18,6 +18,7 @@
 @import "../../../assets/scss/mixins/mixin.scss";
 @import "../../../assets/scss/variable.scss";
 .chartData-card {
+    background-color: $white;
     word-wrap: break-word;
     @include box-shadow(0px, 1px, 15px, 0px, rgba(69, 90, 100, 0.1));
     @include transition(all, 0.2s, null, null);
index 80ea8bf..504fdfe 100644 (file)
@@ -15,11 +15,11 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
   <div class="col-sm-4">
       <div class="d-flex align-items-center header-style">{{'PAGE.VIMDETAILS.VIMACCOUNTDETAILS' | translate}}</div>
   </div>
-  <div class="col-sm-8 text-right">
+  <div class="col-sm-8 text-end">
       <span class="button">
           <button class="btn btn-primary" type="button" placement="top" container="body"
               ngbTooltip="{{'PAGE.VIMDETAILS.NEWVIM' | translate}}" routerLink="/vim/new">
@@ -37,7 +37,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </div>
   </div>
 </div>
-<div class="col-12">
+<div class="d-grid col-sm-12">
   <button type="button" class="btn btn-block border-0 bg-light text-dark" (click)="isCollapsed = !isCollapsed"
     [attr.aria-expanded]="!isCollapsed">
     {{'PAGE.VIMDETAILS.CONFIGPARAMETERS' | translate}}
@@ -51,7 +51,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </div>
   </div>
 </div>
-<div class="modal-footer list border-0">
+<div class="modal-footer list border-0 mt-3">
   <button (click)="onVimAccountBack()"
     class="btn btn-danger pull-right">{{'PAGE.VIMDETAILS.BACKTOVIMACCOUNTS' | translate}}</button>
 </div>
index 8c2b739..4efa471 100644 (file)
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 */
+@import "../../../assets/scss/variable.scss";
+.text-dark {
+   color: $gray-800 !important;
+}
+.font-weight-bold {
+   font-weight: 700 !important;
+}
+button.bg-light:hover, button.bg-light:focus {
+   background-color: $paleblue !important;
+}
\ No newline at end of file
index b89a1b9..42a3209 100644 (file)
 /**
  * @file Info VIM Page
  */
-import { isNullOrUndefined } from 'util';
 import { Component, Injector, OnInit } from '@angular/core';
 import { ActivatedRoute, Router } from '@angular/router';
 import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+import { TranslateService } from '@ngx-translate/core';
+import { NotifierService } from 'angular-notifier';
 import { ERRORDATA } from 'CommonModel';
 import { DataService } from 'DataService';
 import { environment } from 'environment';
 import * as HttpStatus from 'http-status-codes';
 import { RestService } from 'RestService';
+import { isNullOrUndefined } from 'SharedService';
 import { CONFIG, VimAccountDetails, VIMData } from 'VimAccountModel';
 
 /**
@@ -82,12 +84,20 @@ export class InfoVimComponent implements OnInit {
   /** Utilizes modal service for any modal operations @private */
   private modalService: NgbModal;
 
+  /** Handle translate @public */
+  private translateService: TranslateService;
+
+  /** Notifier service to popup notification @private */
+  private notifierService: NotifierService;
+
   constructor(injector: Injector) {
     this.injector = injector;
     this.restService = this.injector.get(RestService);
     this.dataService = this.injector.get(DataService);
     this.activatedRoute = this.injector.get(ActivatedRoute);
     this.modalService = this.injector.get(NgbModal);
+    this.translateService = this.injector.get(TranslateService);
+    this.notifierService = this.injector.get(NotifierService);
     this.router = this.injector.get(Router);
   }
 
@@ -141,10 +151,15 @@ export class InfoVimComponent implements OnInit {
         this.isLoadingResults = false;
       }, (error: ERRORDATA) => {
         this.isLoadingResults = false;
-        if (error.error.status === HttpStatus.NOT_FOUND || error.error.status === HttpStatus.UNAUTHORIZED) {
+        if (error.error.status === HttpStatus.NOT_FOUND) {
           this.router.navigateByUrl('404', { skipLocationChange: true }).catch((): void => {
             // Catch Navigation Error
           });
+        } else if (error.error.status === HttpStatus.UNAUTHORIZED) {
+          this.notifierService.notify('error', this.translateService.instant('HTTPERROR.401'));
+          this.router.navigate(['/vim/details']).catch((): void => {
+            // Catch Navigation Error
+          });
         } else {
           this.restService.handleError(error, 'get');
         }
index be535d2..7f719a2 100644 (file)
@@ -16,7 +16,7 @@ limitations under the License.
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
 <form [formGroup]="vimNewAccountForm" (ngSubmit)="newVimAccountSubmit()" autocomplete="off">
-    <div class="row d-flex flex-row justify-content-between">
+    <div class="d-flex flex-row justify-content-between">
         <div *ngIf="vimID;else empty" class="d-flex align-items-center header-style">{{'PAGE.VIMDETAILS.EDITVIMACCOUNT'
             | translate}} </div>
         <ng-template #empty>
@@ -32,7 +32,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <div class="col-sm-3">
                 <label for="name">{{'PAGE.VIMDETAILS.NAME' | translate}}*</label>
             </div>
-            <div class="col-sm-3">
+            <div class="col-sm-3 mb-3">
                 <input autocomplete="off" class="form-control" placeholder="{{'PAGE.VIMDETAILS.NAME' | translate}}"
                     type="text" formControlName="name" id="name"
                     [ngClass]="{ 'is-invalid': submitted && f.name.errors }">
@@ -40,7 +40,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <div class="col-sm-3">
                 <label for="vim_tenant_name">{{'PAGE.VIMDETAILS.TENANTNAME' | translate}}*</label>
             </div>
-            <div class="col-sm-3">
+            <div class="col-sm-3 mb-3">
                 <input autocomplete="off" class="form-control"
                     placeholder="{{'PAGE.VIMDETAILS.TENANTNAME' | translate}}" type="text"
                     formControlName="vim_tenant_name" id="vim_tenant_name"
@@ -51,7 +51,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <div class="col-sm-3">
                 <label for="vim_type">{{'PAGE.VIMDETAILS.VIMTYPE' | translate}}*</label>
             </div>
-            <div class="col-sm-3">
+            <div class="col-sm-3 mb-3">
                 <ng-select bindLabel="title" bindValue="value" [items]="vimType" placeholder="{{'SELECT' | translate}}"
                     formControlName="vim_type" id="vim_type" [(ngModel)]="selectedVimType"
                     [addTag]="sharedService.addCustomTag" [ngClass]="{ 'is-invalid': submitted && f.vim_type.errors }"
@@ -62,7 +62,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <div class="col-sm-3">
                 <label for="description">{{'PAGE.VIMDETAILS.DESCRIPTION' | translate}}</label>
             </div>
-            <div class="col-sm-3">
+            <div class="col-sm-3 mb-3">
                 <textarea class="form-control" placeholder="{{'PAGE.VIMDETAILS.DESCRIPTION' | translate}}" type="text"
                     formControlName="description" id="description"></textarea>
             </div>
@@ -71,7 +71,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <div class="col-sm-3">
                 <label for="vim_url">{{'PAGE.VIMDETAILS.VIMURL' | translate}}*</label>
             </div>
-            <div class="col-sm-3">
+            <div class="col-sm-3 mb-3">
                 <input autocomplete="off" class="form-control" placeholder="{{'PAGE.VIMDETAILS.VIMURL' | translate}}"
                     type="url" formControlName="vim_url" id="vim_url"
                     [ngClass]="{ 'is-invalid': submitted && f.vim_url.errors }">
@@ -82,7 +82,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <div class="col-sm-3">
                 <label for="schema_type">{{'PAGE.VIMDETAILS.SCHEMATYPE' | translate}}</label>
             </div>
-            <div class="col-sm-3">
+            <div class="col-sm-3 mb-3">
                 <input autocomplete="off" class="form-control"
                     placeholder="{{'PAGE.VIMDETAILS.SCHEMATYPE' | translate}}" type="text" formControlName="schema_type"
                     id="schema_type">
@@ -92,7 +92,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <div class="col-sm-3">
                 <label for="vim_user">{{'PAGE.VIMDETAILS.VIMUSERNAME' | translate}}*</label>
             </div>
-            <div class="col-sm-3">
+            <div class="col-sm-3 mb-3">
                 <input autocomplete="off" class="form-control"
                     placeholder="{{'PAGE.VIMDETAILS.VIMUSERNAME' | translate}}" type="text" formControlName="vim_user"
                     id="vim_user" [ngClass]="{ 'is-invalid': submitted && f.vim_user.errors }">
@@ -100,7 +100,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <div class="col-sm-3">
                 <label for="vim_password">{{'PAGE.VIMDETAILS.VIMPASSWORD' | translate}}*</label>
             </div>
-            <div class="col-sm-3">
+            <div class="col-sm-3 mb-3">
                 <input autocomplete="off" class="form-control" placeholder="VIM Password" type="password"
                     formControlName="vim_password" id="vim_password"
                     [ngClass]="{ 'is-invalid': submitted && f.vim_password.errors }">
@@ -110,7 +110,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <div class="col-sm-3">
                 <label for="location">{{'PAGE.VIMDETAILS.VIMLOCATION' | translate}}</label>
             </div>
-            <div class="col-sm-9 form-inline">
+            <div class="col-sm-9 form-inline mb-3">
                 <div class="input-group">
                     <input autocomplete="off" formControlName="locationName" type="text" class="form-control"
                         placeholder="{{'PAGE.VIMDETAILS.NAME' | translate}}"
@@ -120,7 +120,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     <input autocomplete="off" formControlName="longitude" type="text" class="form-control"
                         placeholder="Longitude" [ngClass]="{ 'is-invalid': submitted && f.longitude.errors }">
                 </div>
-                <small class="text-info mt-1 ml-1">{{'PAGE.VIM.LOCATIONINFO' | translate}}</small>
+                <small class="text-info mt-1 me-1">{{'PAGE.VIM.LOCATIONINFO' | translate}}</small>
             </div>
         </div>
         <div class="row form-group content-style">
@@ -129,17 +129,14 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             </div>
             <div class="col-sm-3 form-group">
                 <div class="custom-file">
-                    <input [disabled]="!selectedVimType" type="file" #fileInput class="custom-file-input"
+                    <input [disabled]="!selectedVimType" type="file" #fileInput class="fileupload custom-file-input"
                         (change)="filesDropped($event.target.files)" id="customFile">
-                    <label class="custom-file-label" #fileInputLabel for="customFile">
-                        {{'CHOOSEFILE' | translate}}
-                    </label>
                 </div>
                 <small class="text-info">{{'UPLOADCONFIGLABEL' | translate}}</small>
             </div>
         </div>
         <div class="row" [hidden]="!selectedVimType">
-            <div class="col-12">
+            <div class="d-grid col-12">
                 <button type="button" class="btn btn-block border-0 bg-light text-dark"
                     (click)="isCollapsed = !isCollapsed"
                     [attr.aria-expanded]="!isCollapsed">{{'PAGE.VIMDETAILS.CONFIGPARAMETERS' | translate}}</button>
@@ -148,8 +145,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         <div id="configurationparameters" class="row collapse mt-3" [ngbCollapse]="isCollapsed">
             <div class="col-sm-12">
                 <div class="ngx-codemirror new-vim" [hidden]="!selectedVimType">
-                    <div class="form-group *ngIf="!vimID">
-                        <button type="button" class="btn btn-warning btn-sm mr-3" (click)="checkData()">
+                    <div class="form-group mb-3" *ngIf="!vimID">
+                        <button type="button" class="btn btn-warning btn-sm me-3" (click)="checkData()">
                             <i class="fa fa-clone" aria-hidden="true"></i>
                             {{'PAGE.VIMDETAILS.LOADSAMPLECONFIG' | translate}}</button>
                         <button type="button" class="btn btn-danger btn-sm" (click)="clearConfig()">
@@ -162,9 +159,9 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                 </div>
             </div>
         </div>
-        <div class="modal-footer border-0">
+        <div class="modal-footer border-0 mb-3 mt-3 me-3">
             <button type="button" (click)="onVimAccountBack()"
-                class="btn btn-danger">{{'PAGE.VIMDETAILS.BACKTOVIMACCOUNTS' | translate}}</button>
+                class="btn btn-danger me-2">{{'PAGE.VIMDETAILS.BACKTOVIMACCOUNTS' | translate}}</button>
             <button *ngIf="!vimID" type="submit" class="btn btn-primary">{{'CREATE' | translate}}</button>
             <button *ngIf="vimID" type="submit" class="btn btn-primary">{{'UPDATE' | translate}}</button>
         </div>
index d750ccc..28444af 100644 (file)
  limitations under the License.
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
-*/
\ No newline at end of file
+*/
+@import "../../../assets/scss/variable.scss";
+.form-control:disabled {
+    background-color: var(--bs-secondary-bg) !important;
+    opacity: 1;
+}
+.d-grid {
+    margin-top: 40px;
+}
+.input-group {
+    width: 74%;
+}
+button.bg-light:hover, button.bg-light:focus {
+    background-color: $paleblue !important;
+ }
\ No newline at end of file
index 05fe4a2..6619bfd 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Vim Account Component.
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, ElementRef, Injector, OnInit, ViewChild } from '@angular/core';
 import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
@@ -48,7 +47,7 @@ import {
 import { environment } from 'environment';
 import * as jsyaml from 'js-yaml';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 import { VimAccountDetails } from 'VimAccountModel';
 import { WarningComponent } from 'WarningComponent';
 /**
index 7feabe2..9838656 100644 (file)
@@ -15,12 +15,12 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex align-items-center justify-content-between">
+<div class="d-flex align-items-center justify-content-between">
     <div class="col-sm-4">
         <div class="d-flex align-items-center header-style">{{'VIMACCOUNTS' | translate}}</div>
     </div>
-    <div class="col-sm-8 text-right">
-        <div class="btn-group list mr-2" role="group">
+    <div class="col-sm-8 text-end">
+        <div class="btn-group list me-2" role="group">
             <button class="btn btn-primary" type="button" (click)="mapView()" placement="top" container="body"
                 ngbTooltip="{{'MAPVIEW' | translate}}" [hidden]="showList" [disabled]="vimData.length == 0">
                 <i class="fas fa-map-marker-alt"></i>&nbsp;
@@ -41,15 +41,15 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </span>
     </div>
 </div>
-<div class="row mt-2 mb-0 list-utilites-actions" [hidden]="showList">
-    <div class="col-auto mr-auto">
+<div class="mt-2 mb-0 list-utilites-actions" [hidden]="showList">
+    <div class="col-auto me-auto">
         <nav class="custom-items-config">
             <span><i class="fas fa-clock text-warning"></i>{{operationalStateFirstStep}}</span>
             <span><i class="fas fa-check-circle text-success"></i>{{operationalStateSecondStep}}</span>
             <span><i class="fas fa-times-circle text-danger"></i>{{operationalStateThirdStep}}</span>
         </nav>
     </div>
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1" [hidden]="showList">
index aeb086e..b79a921 100644 (file)
     width: 100%;
     .ol-popup {
         @include background(null, $white, null, null, null);
-        -webkit-filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
-        filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
+        -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
+        filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
         @include border(all, 1, solid, $gray-80);
         @include position_value(absolute, $top: null, $right: null, $bottom: 12px, $left: -50px);
         @include wh-value(280px, null);
         @include font-style(normal);
-        @include font(null, .765625rem, 400);
+        @include font(null, 0.765625rem, 400);
         @include line-height(1.5);
         text-align: start;
         text-decoration: none;
@@ -39,7 +39,8 @@
         line-break: auto;
         word-wrap: break-word;
         @include roundedCorners(2px);
-        &:after, &:before{
+        &:after,
+        &:before {
             top: 100%;
             @include border(all, 1, solid, transparent);
             content: " ";
             content: "✖";
         }
     }
+    .close {
+        opacity: 1;
+        background-color: transparent;
+        border: 0;
+        position: absolute;
+        right: 10px;
+        bottom: 213px;
+        font-size: 1.31rem;
+    }
 }
\ No newline at end of file
index ac0b502..20081c4 100644 (file)
@@ -169,16 +169,16 @@ export class VimAccountDetailsComponent implements OnInit {
                 valuePrepareFunction: (cell: VIMData, row: VIMData): string => {
                     if (row.operationalState === this.operationalStateFirstStep) {
                         return `<span class="icon-label" title="${row.operationalState}">
-                        <i class="fas fa-clock text-warning"></i>
-                        </span>`;
+                         <i class="fas fa-clock text-warning"></i>
+                         </span>`;
                     } else if (row.operationalState === this.operationalStateSecondStep) {
                         return `<span class="icon-label" title="${row.operationalState}">
-                        <i class="fas fa-check-circle text-success"></i>
-                        </span>`;
+                         <i class="fas fa-check-circle text-success"></i>
+                         </span>`;
                     } else if (row.operationalState === this.operationalStateThirdStep) {
                         return `<span class="icon-label" title="${row.operationalState}">
-                        <i class="fas fa-times-circle text-danger"></i>
-                        </span>`;
+                         <i class="fas fa-times-circle text-danger"></i>
+                         </span>`;
                     } else {
                         return `<span>${row.operationalState}</span>`;
                     }
@@ -360,7 +360,7 @@ export class VimAccountDetailsComponent implements OnInit {
                 }
             }
         });
-        if (this.getLocation !== []) {
+        if (this.getLocation.length) {
             this.getLocation.filter((loc: GetLocation) => {
                 if (loc.location !== '') {
                     if (loc.location !== ',,') {
@@ -456,7 +456,7 @@ export class VimAccountDetailsComponent implements OnInit {
         this.popupData += '<ul class="list-unstyled m-2">';
         const instnaceData: NSInstanceDetails[] = this.nsData.filter((item: NSInstanceDetails) => {
             if (item.datacenter === feature.values_.Id) {
-                this.popupData += '<li class="m-2"><a class="d-block text-truncate" target="_parent" href="instances/ns/' + item._id + '"><i class="fa-sitemap fas icons mr-1"></i>'
+                this.popupData += '<li class="m-2"><a class="d-block text-truncate" target="_parent" href="instances/ns/' + item._id + '"><i class="fa-sitemap fas icons me-1"></i>'
                     + item.name + '</a></li>';
                 return item;
             }
index 925a5a2..b69ae7c 100644 (file)
@@ -27,14 +27,14 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
             <label class="col-sm-12 col-form-label mandatory-label"
                 [ngClass]="{'text-danger': wimNewAccountForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
             <label class="col-sm-4 col-form-label" for="name">{{'NAME' | translate}}*</label>
-            <div class="col-sm-8">
+            <div class="col-sm-8 mb-3">
                 <input autocomplete="off" class="form-control" placeholder="{{'NAME' | translate}}" type="text"
                     formControlName="name" id="name" [ngClass]="{ 'is-invalid': submitted && f.name.errors }" required>
             </div>
         </div>
         <div class="form-group row">
             <label class="col-sm-4 col-form-label" for="wim_type">{{'TYPE' | translate}}*</label>
-            <div class="col-sm-8">
+            <div class="col-sm-8 mb-3">
                 <ng-select bindLabel="title" bindValue="value" [items]="wimType" placeholder="{{'SELECT' | translate}}"
                     formControlName="wim_type" id="wim_type" [(ngModel)]="wimTypeMod" [addTag]="sharedService.addCustomTag"
                     [ngClass]="{ 'is-invalid': submitted && f.wim_type.errors }" required>
@@ -44,7 +44,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
         <div class="form-group row">
             <label class="col-sm-4 col-form-label" for="wim_url">{{'URL' | translate}}*</label>
-            <div class="col-sm-8">
+            <div class="col-sm-8 mb-3">
                 <input autocomplete="off" class="form-control" placeholder="{{'URL' | translate}}" type="url"
                     formControlName="wim_url" id="wim_url" [ngClass]="{ 'is-invalid': submitted && f.wim_url.errors }"
                     required>
@@ -55,7 +55,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
         <div class="form-group row">
             <label class="col-sm-4 col-form-label" for="user">{{'PAGE.WIMACCOUNTS.USERNAME' | translate}}*</label>
-            <div class="col-sm-8">
+            <div class="col-sm-8 mb-3">
                 <input autocomplete="off" class="form-control" placeholder="{{'PAGE.WIMACCOUNTS.USERNAME' | translate}}"
                     type="text" formControlName="user" id="user"
                     [ngClass]="{ 'is-invalid': submitted && f.user.errors }" required>
@@ -63,7 +63,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
         <div class="form-group row">
             <label class="col-sm-4 col-form-label" for="password">{{'PAGE.WIMACCOUNTS.PASSWORD' | translate}}*</label>
-            <div class="col-sm-8">
+            <div class="col-sm-8 mb-3">
                 <input autocomplete="off" class="form-control" placeholder="{{'PAGE.WIMACCOUNTS.PASSWORD' | translate}}"
                     type="password" formControlName="password" id="password"
                     [ngClass]="{ 'is-invalid': submitted && f.password.errors }" required>
@@ -71,7 +71,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </div>
         <div class="form-group row">
             <label class="col-sm-4 col-form-label" for="description">{{'DESCRIPTION' | translate}}</label>
-            <div class="col-sm-8">
+            <div class="col-sm-8 mb-3">
                 <textarea class="form-control" placeholder="{{'DESCRIPTION' | translate}}" type="text"
                     formControlName="description" id="description"></textarea>
             </div>
@@ -83,9 +83,8 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
                     id="config"></textarea>
                 <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
                 <div class="custom-file">
-                    <input type="file" #fileInputConfig class="custom-file-input"
+                    <input type="file" #fileInputConfig class="fileupload custom-file-input"
                         (change)="configFile($event.target.files)" id="customFile">
-                    <label class="custom-file-label" #fileInputConfigLabel for="customFile">{{'CHOOSEFILE' | translate}}</label>
                 </div>
             </div>
         </div>
index 65ae937..2fa3b96 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file WIM Account Component.
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Component, ElementRef, Injector, OnInit, ViewChild } from '@angular/core';
 import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
@@ -29,7 +28,7 @@ import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, TYPESECTION, WIM_TYPES
 import { environment } from 'environment';
 import * as jsyaml from 'js-yaml';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { SharedService, isNullOrUndefined } from 'SharedService';
 
 /**
  * Creating component
index 2c2d839..2b34ea2 100644 (file)
@@ -15,7 +15,7 @@ limitations under the License.
 
 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 -->
-<div class="row d-flex flex-row justify-content-between">
+<div class="d-flex flex-row justify-content-between">
     <div class="d-flex align-items-center header-style">{{'WIMACCOUNTS' | translate}}</div>
     <span class="button">
         <button class="btn btn-primary" type="button" placement="top" container="body" ngbTooltip="{{'PAGE.WIMACCOUNTS.NEWWIM' | translate}}"
@@ -24,15 +24,15 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
         </button>
     </span>
 </div>
-<div class="row mt-2 mb-0 list-utilites-actions">
-    <div class="col-auto mr-auto">
+<div class="mt-2 mb-0 list-utilites-actions">
+    <div class="col-auto me-auto">
         <nav class="custom-items-config">
             <span><i class="fas fa-clock text-warning"></i>{{operationalStateFirstStep}}</span>
             <span><i class="fas fa-check-circle text-success"></i>{{operationalStateSecondStep}}</span>
             <span><i class="fas fa-times-circle text-danger"></i>{{operationalStateThirdStep}}</span>
         </nav>
     </div>
-    <page-per-row class="mr-2" (pagePerRow)="onChange($event)"></page-per-row>
+    <page-per-row class="me-2" (pagePerRow)="onChange($event)"></page-per-row>
     <page-reload></page-reload>
 </div>
 <div class="smarttable-style bg-white mt-1">
index 930b63d..7f4fd92 100644 (file)
@@ -22,7 +22,7 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
   </button>
 </div>
 <div class="modal-body modal-body-custom-height p-0">
-  <table class="table table-striped table-layout-fixed mb-0" *ngIf="wimDetails">
+  <table class="table table-borderless table-layout-fixed mb-0" *ngIf="wimDetails">
     <tr>
       <td colspan="2">
         <b>{{'ID' | translate}}:</b> {{(wimDetails._id)?wimDetails._id:''}}
@@ -35,9 +35,9 @@ Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.i
     </tr>
     <tr>
       <td>
-        <b>{{'OPERATIONALSTATE' | translate}}:</b><span class="ml-1 badge" [ngClass]="{'badge-warning text-white':wimDetails._admin.operationalState === operationalStateFirstStep,
-        'badge-success':wimDetails._admin.operationalState === operationalStateSecondStep,
-        'badge-danger':wimDetails._admin.operationalState === operationalStateThirdStep}">
+        <b>{{'OPERATIONALSTATE' | translate}}:</b><span class="ms-1 badge" [ngClass]="{'badge bg-warning text-white p-1':wimDetails._admin.operationalState === operationalStateFirstStep,
+        'badge bg-success text-white p-1':wimDetails._admin.operationalState === operationalStateSecondStep,
+        'badge bg-danger text-white p-1':wimDetails._admin.operationalState === operationalStateThirdStep}">
           {{(wimDetails._admin.operationalState)?wimDetails._admin.operationalState:''}}
         </span>
       </td>
index 021d205..34a3091 100644 (file)
  limitations under the License.
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
-*/
\ No newline at end of file
+*/
+@import "../../../assets/scss/variable.scss";
+.table thead th {
+   vertical-align: bottom;
+   border-bottom: 2px solid rgba(0, 0, 0, .1);
+ }
+ .table th, .table td {
+   padding: 1rem;
+   vertical-align: top;
+   border-top: 1px solid rgba(0, 0, 0, .1);
+   border-bottom: transparent;
+ }
+ .table b {
+   background: none;
+   color: $body-color;
+   padding-right: 0px;
+   padding-left: 0px;
+ }
\ No newline at end of file
index 97527ec..dd6e156 100644 (file)
     "UPDATENS": "NS aktualisieren",
     "GENERICCONTENT": "Diese Aktion umfasst die Neuerstellung der Ressourcen dieser VNF. Sind Sie sicher, dass Sie fortfahren möchten",
     "VNFDNAME": "Vnfd-Name",
+    "HEALING": "Manuelle Heilung",
+    "DAY1OPERATION": "Tag-1 Operation",
+    "SELECTVDU": "Wählen VDU",
+    "DATE": "Datum",
     "PAGE": {
         "DASHBOARD": {
             "DASHBOARD": "Instrumententafel",
index c6a419c..ebe8d7c 100644 (file)
     "UPDATENS": "Update NS",
     "GENERICCONTENT": "This action involves recreating the resources of this VNF. Are you sure you want to proceed",
     "VNFDNAME": "Vnfd Name",
+    "HEALING": "Manual Healing",
+    "DAY1OPERATION": "Day1 operation",
+    "SELECTVDU": "Select VDU",
+    "DATE": "Date",
     "PAGE": {
         "DASHBOARD": {
             "DASHBOARD": "Dashboard",
index 9332c26..354058b 100644 (file)
     "UPDATENS": "Actualizar NS",
     "GENERICCONTENT": "Esta acción implica recrear los recursos de este VNF. Estas seguro que deseas continuar",
     "VNFDNAME": "Nombre Vnfd",
+    "HEALING": "Curación Manual",
+    "DAY1OPERATION": "Operación día 1",
+    "SELECTVDU": "Seleccionar VDU",
+    "DATE":"Fecha",
     "PAGE": {
         "DASHBOARD": {
             "DASHBOARD": "Tablero",
index a553f38..98b3c46 100644 (file)
     "UPDATENS": "Atualizar NS",
     "GENERICCONTENT": "Esta ação envolve a recriação dos recursos desta VNF. Tem certeza de que deseja continuar",
     "VNFDNAME": "Nome Vnfd",
+    "HEALING": "Cura Manual",
+    "DAY1OPERATION": "Operação dia 1",
+    "SELECTVDU": "Selecione VDU",
+    "DATE":"Data",
     "PAGE": {
         "DASHBOARD": {
             "DASHBOARD": "painel de controle",
index cb96c93..031608d 100644 (file)
@@ -31,6 +31,16 @@ button[type="submit"]:focus,
 .btn-danger:focus {
   @include box-shadow(0, 0, 0, 0.2rem, lighten($danger, 30%) !important);
 }
+.btn-success {
+  --bs-btn-hover-bg: #198754;
+}
+.btn-danger {
+  --bs-btn-hover-bg: #cb3424;
+  --bs-btn-color: #fff;
+  --bs-btn-hover-color: #fff;
+  --bs-btn-active-bg: #cb3424;
+  --bs-btn-active-color: #fff;
+}
 body,
 .list-overflow,
 .scroll-box,
@@ -40,7 +50,8 @@ body,
 .CodeMirror-vscrollbar,
 .ng-sidebar,
 .runninginstances .popover-body,
-.resources-chart-popover .popover-body {
+.resources-chart-popover .popover-body,
+.ng-dropdown-panel .scroll-host {
   &::-webkit-scrollbar {
     @include wh-value(10px, null);
   }
@@ -69,6 +80,7 @@ body {
     @include background(null, $theme-bg-color !important, null, null, null);
   }
   a {
+    text-decoration: none;
     color: $primary;
     &:hover,
     &:focus {
@@ -109,6 +121,7 @@ body {
       }
       &:disabled {
         cursor: not-allowed;
+        background-color: grey;
       }
     }
   }
@@ -125,11 +138,15 @@ body {
     );
   }
   .form-control {
+    color: #4f5467;
+    border-radius: 4px;
+    background-color: $white;
     @include roundedCorners(4);
     @include font(null, 12px, null);
     &::placeholder {
       color: $gray-400;
     }
+    background-color: $white;
   }
   .header-style {
     @include font(null, 1.2rem, 700);
@@ -142,7 +159,7 @@ body {
   .cursor-pointer {
     cursor: pointer;
   }
-  .mr-top-5 {
+  .me-top-5 {
     @include margin-value-percentage(5px, auto, auto, auto);
   }
   .padLeft0 {
@@ -171,18 +188,31 @@ body {
   }
   .close {
     opacity: 1 !important;
+    background-color: transparent;
+    border: 0;
+    position: absolute;
+    right: 10px;
+    font-size: 1.3125rem;
   }
   .closeVersion {
     text-shadow: none;
   }
   .roles-section {
     .card {
+      .card-body {
+        background-color: #fff;
+      }
       .bg-secondary {
+        padding: 11px;
         @include background(null, $gray-400 !important, null, null, null);
       }
     }
   }
   .juju-section {
+    .col-form-label {
+      position: relative;
+      bottom: 3px;
+    }
     .card {
       @include roundedCorners(4);
       margin-bottom: 0.25rem;
@@ -194,7 +224,13 @@ body {
           color: $white;
         }
       }
+      .card-header {
+        padding: 0.75rem 1.25rem;
+        border-top-left-radius: 4px;
+        border-top-right-radius: 4px;
+      }
       .card-body {
+        border-radius: 2px;
         .seconds-btn-group .active {
           color: $white;
           @include background(null, $primary !important, null, null, null);
@@ -203,14 +239,20 @@ body {
         @include padding-value(5, 5, 5, 5);
         border-top: 0;
         table {
+          th,
+          td {
+            color: $body-color;
+          }
           thead th {
             font-size: 12px;
+            color: $body-color;
           }
           tbody th i.active-icon {
             font-size: 10px;
           }
         }
       }
+      background-color: #fff;
     }
   }
   .card {
@@ -221,6 +263,7 @@ body {
     @include roundedCorners(3);
     .custom-card-body {
       @include padding-value(15, 15, 15, 15);
+      background-color: #fff;
     }
   }
   table-cell-default-editor select-editor select {
@@ -241,7 +284,17 @@ body {
     @include roundedCorners(3);
   }
   /** Model Popup-Design **/
+  .modal-header {
+    .close {
+      top: 10px;
+    }
+  }
+  .modal-content {
+    background-color: #fff;
+  }
   .modal-body-custom-height {
+    background-color: #fff !important;
+    color: $body-color;
     max-height: 65vh;
     overflow-y: auto;
   }
@@ -255,30 +308,37 @@ body {
   }
   /** Popover Header **/
   .popover-header {
+    margin-top: 7px;
     color: $primary;
     @include background(null, $theme-bg-color, null, null, null);
   }
   /** Vim Show running instance Details **/
   .runninginstances {
     width: 200px;
+    margin-top: 10px;
     .popover-body {
       max-height: 200px;
       overflow-y: scroll;
+      background-color: $white !important;
     }
   }
   .resources-chart-popover {
+    margin-top: 4px;
     max-width: 60% !important;
     width: 600px !important;
     @include font-family("Roboto");
     .popover-body {
       max-height: 60vh;
       overflow-y: scroll;
+      background-color: #fff !important;
     }
   }
   /****************************************************************************/
   /************************** Smart table custom design ***********************/
   /****************************************************************************/
   ng2-smart-table {
+    background-color: #fff;
+    background-color: none;
     @include font(null, 15px, null);
     color: $gray-700;
     .form-control {
@@ -348,15 +408,29 @@ body {
       }
     }
     .ng2-smart-filter {
+      background-color: #fff;
       @include wh-value(null, calc(2rem + 2px) !important);
       @include font(null, 12px, null);
       margin-top: 6px;
     }
+    input {
+      background-color: #fff !important;
+    }
     table.list-data {
       tr td,
       tr th {
         @include padding-value(2, 10, 2, 10);
         vertical-align: middle !important;
+        background-color: #fff;
+        color: grey;
+      }
+      input[type="checkbox"] {
+        padding: 6px 6px;
+        border-color: rgba(0, 0, 0, 0.5);
+        &:checked {
+          background-color: $blue !important;
+          border: black;
+        }
       }
       tbody {
         tr.selected {
@@ -367,6 +441,7 @@ body {
     default-table-filter {
       select-filter {
         select.form-control {
+          background-color: #fff !important;
           @include flexbox(inline-block, null, null, null, null, null);
           @include wh-value(null, calc(1.5rem + 2px) !important);
           vertical-align: middle;
@@ -391,9 +466,11 @@ body {
       }
       input-filter {
         input[type="text"] {
+          background-color: #fff;
           @include position_value(relative, null, null, null, null);
         }
         &:after {
+          color: #afb5c1;
           @include position_value(relative, -26px, null, null, 100%);
           content: "\f002";
           @include font("Font Awesome 5 Free", 10px, null);
@@ -414,6 +491,8 @@ body {
             }
           }
           .ng2-smart-page-link {
+            background-color: #fff;
+            box-shadow: none;
             @include font(null, 12px !important, null);
             &.page-link {
               text-align: center;
@@ -471,12 +550,15 @@ body {
   /*********************** List Action Dropdown section ***********************/
   /****************************************************************************/
   .list-action-dropdown {
+    background-color: #fff;
     @include border(all, 1, solid, $primary);
     @include padding-value(0, 0, 0, 0);
+    margin-top: 3px;
     button.btn.btn-primary {
       @include background(null, transparent, null, null, null);
       @include padding-value(8, 8, 8, 8);
       @include roundedCorners(0);
+      background-color: #fff;
       color: $primary;
       &:hover {
         @include background(null, $primary, null, null, null);
@@ -491,12 +573,14 @@ body {
   /*********************** Custom tabel design in topology ********************/
   /****************************************************************************/
   .custom-table {
+    border: 1px solid rgba(0, 0, 0, 0.1);
     td:first-child {
       @include font(null, null, bold);
       text-align: right;
     }
     th,
     td {
+      border: 1px solid rgba(0, 0, 0, 0.1);
       @include padding-value(5, 7, 5, 7);
       @include font(null, 10px, null);
       @include line-height(15px);
@@ -516,10 +600,18 @@ body {
       }
     }
   }
+  .ng-dropdown-panel .scroll-host {
+    overflow-x: auto;
+  }
+  .ng-dropdown-panel .ng-dropdown-panel-items .ng-option {
+    text-overflow: unset;
+    overflow: unset;
+  }
   /****************************************************************************/
   /******************** Custom nav section for default status *****************/
   /****************************************************************************/
   .list-utilites-actions {
+    margin-left: 10px;
     @include flexbox(flex, null, row, null, center, null);
     nav.custom-items-config {
       @include position_value(relative, null, null, null, null);
@@ -544,6 +636,22 @@ body {
   /****************************************************************************/
   /************************* File upload custom design ************************/
   /****************************************************************************/
+  .fileupload {
+    border: 1px solid;
+    border: 1px solid;
+    border-color: #054c8c;
+    border-radius: 4px;
+  }
+  input[type="file"] {
+    width: 100%;
+  }
+  input[type="file"]::file-selector-button {
+    border: none;
+    background: #054c8c;
+    padding: 7px 10px;
+    border-radius: 2px;
+    color: #fff;
+  }
   .custom-file-label {
     color: $primary;
     @include roundedCorners(4);
@@ -605,6 +713,7 @@ body {
           @include flexbox(flex, null, null, null, center, null);
           border: none;
           .span-overflow-text {
+            color: $black;
             @include wh-value(90%, null);
             white-space: nowrap;
             overflow: hidden;
@@ -657,6 +766,7 @@ body {
     fieldset {
       @include border(all, 1, solid, $primary);
       legend {
+        float: none;
         @include padding-value(0, 5, 0, 5);
         @include font(null, 15px, null);
         color: $primary;
@@ -668,6 +778,9 @@ body {
           @include wh-value(25%, null);
         }
       }
+      .font-weight-bold {
+        font-weight: 700 !important;
+      }
     }
     .btn-icon {
       @include wh-value(36px, 36px);
@@ -858,3 +971,67 @@ body {
     border: none;
   }
 }
+
+.custom-select {
+  background-color: #fff !important;
+  padding: 0.375rem 1.75rem 0.375rem 0.75rem;
+  @include background(
+    url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='100' height='10' viewBox='0 0 10 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e"),
+    var(--input-bg-color),
+    null,
+    no-repeat,
+    0px 10px
+  );
+}
+/****************************************************************************/
+/************************** HEALING STYLE ***********************************/
+/****************************************************************************/
+
+app-healing {
+  .card {
+    border-radius: 15px;
+    width: auto;
+    height: auto;
+    margin-bottom: 5px;
+  }
+
+  .card-body {
+    flex: 1 1 auto;
+    min-height: 1px;
+    padding: 5px;
+  }
+
+  .form-group {
+    margin-bottom: 1px;
+    .row {
+      margin-bottom: 16px;
+    }
+  }
+
+  .col-sm-1 {
+    bottom: 20px;
+  }
+
+  .col-5 {
+    left: 79px;
+  }
+}
+
+.table thead th {
+  vertical-align: bottom;
+  border-bottom: 2px solid rgba(0, 0, 0, 0.1);
+}
+.table th,
+.table td {
+  background-color: #fff;
+  padding: 5px;
+  vertical-align: top;
+  border-top: 1px solid rgba(0, 0, 0, 0.1);
+  border-bottom: transparent;
+}
+.table b {
+  background: none;
+  color: $body-color;
+  padding-right: 0px;
+  padding-left: 0px;
+}
index 40c5e16..f2ad391 100644 (file)
@@ -45,4 +45,4 @@ $roboto-font-path: "~roboto-fontface/fonts" !default;
 @import "../../../node_modules/angular-notifier/styles/types/type-default.scss";
 @import "../../../node_modules/angular-notifier/styles/types/type-info.scss";
 /*toastr styles*/
-@import '~ngx-toastr/toastr.css';
\ No newline at end of file
+@import '/node_modules/ngx-toastr/toastr';
\ No newline at end of file
index 3af9d3b..5fcb793 100644 (file)
@@ -124,6 +124,7 @@ $teal: #20c997 !default;
 $cyan: #4fc3f7 !default;
 $grayish-red: #c1bfbf !default;
 $white-smoke: #f1f1f1 !default;
+$paleblue: #c8e1f9 !default;
 $text-muted: $gray-500 !default;
 $colors: (
   "blue": $blue,
index abf0cb6..a3038f1 100644 (file)
@@ -54,6 +54,7 @@ export enum CONFIGCONSTANT {
     operationalStateSecondStep = 'running',
     operationalStateThirdStep = 'failed',
     operationalStateFourthStep = 'scaling',
+    operationalStateFifthStep = 'healing',
     configStateFirstStep = 'init',
     configStateSecondStep = 'configured',
     configStateThirdStep = 'failed',
index d9d0620..5944aef 100644 (file)
@@ -41,7 +41,7 @@ export const MENU_ITEMS: MENUITEMS[] = [
     },
     {
         liClass: 'round-edge-top-3',
-        anchorTagClass: 'parentlink round-edge-top-3 mr-top-5',
+        anchorTagClass: 'parentlink round-edge-top-3 me-top-5',
         clickFunction: 'packages',
         routerLink: '/packages',
         routerLinkActive: ['menu-open', 'parentactive'],
@@ -148,7 +148,7 @@ export const MENU_ITEMS: MENUITEMS[] = [
         ]
     },
     {
-        liClass: 'round-edge-top-3 round-edge-bottom-3 mr-top-5',
+        liClass: 'round-edge-top-3 round-edge-bottom-3 me-top-5',
         anchorTagClass: 'link round-edge-top-3 round-edge-bottom-3 individual',
         clickFunction: 'nosubmenu',
         routerLink: '/sdn/details',
@@ -159,7 +159,7 @@ export const MENU_ITEMS: MENUITEMS[] = [
         isChildExists: false
     },
     {
-        liClass: 'round-edge-top-3 round-edge-bottom-3 mr-top-5',
+        liClass: 'round-edge-top-3 round-edge-bottom-3 me-top-5',
         anchorTagClass: 'link round-edge-top-3 round-edge-bottom-3 individual',
         clickFunction: 'nosubmenu',
         routerLink: '/vim',
@@ -170,7 +170,7 @@ export const MENU_ITEMS: MENUITEMS[] = [
         isChildExists: false
     },
     {
-        liClass: 'round-edge-top-3 round-edge-bottom-3 mr-top-5',
+        liClass: 'round-edge-top-3 round-edge-bottom-3 me-top-5',
         anchorTagClass: 'parentlink round-edge-top-3 round-edge-bottom-3',
         clickFunction: 'k8s',
         routerLink: '/k8s',
@@ -204,7 +204,7 @@ export const MENU_ITEMS: MENUITEMS[] = [
         ]
     },
     {
-        liClass: 'round-edge-top-3 round-edge-bottom-3 mr-top-5',
+        liClass: 'round-edge-top-3 round-edge-bottom-3 me-top-5',
         anchorTagClass: 'link round-edge-top-3 round-edge-bottom-3 individual',
         clickFunction: 'nosubmenu',
         routerLink: '/repos/details',
@@ -215,7 +215,7 @@ export const MENU_ITEMS: MENUITEMS[] = [
         isChildExists: false
     },
     {
-        liClass: 'round-edge-top-3 round-edge-bottom-3 mr-top-5',
+        liClass: 'round-edge-top-3 round-edge-bottom-3 me-top-5',
         anchorTagClass: 'link round-edge-top-3 round-edge-bottom-3 individual',
         clickFunction: 'nosubmenu',
         routerLink: '/wim/details',
index 5039cc5..ffa95a2 100644 (file)
@@ -388,3 +388,18 @@ export interface VNFRINFO {
     vnfdId: string;
     memberIndex: string;
 }
+
+/** Interface for vdu mappings */
+export interface VDUMAP {
+    vdu_mappings?: VDUMAPPINGS[];
+}
+
+/** Interface for vdu Mappings */
+export interface VDUMAPPINGS {
+    vduId?: string;
+    'vdu-id'?: string;
+    countIndex?: string;
+    'count-index'?: string;
+    runDay1?: Boolean;
+    'run-day1'?: Boolean;
+}
index 1ee7f64..ec77d04 100644 (file)
@@ -28,6 +28,7 @@ import { Observable } from 'rxjs';
  * @Injectable takes a metadata object that tells Angular how to compile and run module code
  */
 @Injectable()
+// eslint-disable-next-line deprecation/deprecation
 export class AcessGuardService implements CanLoad {
     /**
      * check if module can be loaded
index 512705f..3e0ef8f 100644 (file)
@@ -30,6 +30,7 @@ import { map } from 'rxjs/operators';
  * @Injectable takes a metadata object that tells Angular how to compile and run module code
  */
 @Injectable()
+// eslint-disable-next-line deprecation/deprecation
 export class AuthGuardService implements CanActivate {
     /** Holds teh instance of AuthService class of type AuthService @private */
     private router: Router;
index a8950e5..904c1cf 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Auth service
  */
-import { isNullOrUndefined } from 'util';
 import { HttpHeaders } from '@angular/common/http';
 import { Injectable, Injector } from '@angular/core';
 import { Router } from '@angular/router';
@@ -28,6 +27,7 @@ import { APIURLHEADER, ERRORDATA } from 'CommonModel';
 import { environment } from 'environment';
 import { BehaviorSubject, Observable } from 'rxjs';
 import { map } from 'rxjs/operators';
+import { isNullOrUndefined } from 'SharedService';
 import { SharedService } from 'SharedService';
 import { ProjectModel } from '../models/VNFDModel';
 import { RestService } from './RestService';
@@ -199,7 +199,7 @@ export class AuthenticationService {
         this.changePassword.next(false);
         const langCode: string = sessionStorage.getItem('languageCode');
         const redirecturl: string = isNullOrUndefined(sessionStorage.getItem('returnUrl')) ? '/' : sessionStorage.getItem('returnUrl');
-        const osmVersion: string = isNullOrUndefined(sessionStorage.getItem('osmVersion')) ? '' : sessionStorage.getItem('osmVersion');
+        const osmVersion: string = isNullOrUndefined(sessionStorage.getItem('version')) ? '' : sessionStorage.getItem('version');
         sessionStorage.clear();
         sessionStorage.setItem('languageCode', langCode);
         sessionStorage.setItem('returnUrl', redirecturl);
index bea559a..5f47fb1 100644 (file)
@@ -20,7 +20,6 @@
  * @file Provider for REST Service
  */
 
-import { isNullOrUndefined } from 'util';
 import { HttpClient, HttpHeaders } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
@@ -41,6 +40,9 @@ export class RestService {
     private http: HttpClient;
     /** API URL. Disabled tslint since server doesn't support https protocol */
     private apiURL: string = '';
+    /** Method to handle null or undefined @private */
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    private isNullOrUndefined = (data: any): boolean => data === null || data === undefined;
     /** Notifier service to popup notification @private */
     private notifierService: NotifierService;
     /** Instance for active modal service @public */
@@ -62,7 +64,7 @@ export class RestService {
 
     public getResource(apiURL: string, httpHeaders?: { headers: HttpHeaders }): Observable<{}> {
         const getRequest: APIURLHEADER = this.getHttpoptions(apiURL);
-        if (!isNullOrUndefined(httpHeaders)) {
+        if (!this.isNullOrUndefined(httpHeaders)) {
             return this.http.get(apiURL, httpHeaders);
         } else {
             return this.http.get(getRequest.url, getRequest.httpOptions);
@@ -77,7 +79,7 @@ export class RestService {
 
     public postResource(apiURLHeader: { url: string, httpOptions?: { headers: HttpHeaders } }, payload: {}): Observable<{}> {
         const getRequest: APIURLHEADER = this.getHttpoptions(apiURLHeader.url);
-        if (!isNullOrUndefined(apiURLHeader.httpOptions)) {
+        if (!this.isNullOrUndefined(apiURLHeader.httpOptions)) {
             return this.http.post(apiURLHeader.url, payload, apiURLHeader.httpOptions);
         } else {
             return this.http.post(getRequest.url, payload, getRequest.httpOptions);
@@ -92,7 +94,7 @@ export class RestService {
 
     public patchResource(apiURLHeader: { url: string, httpOptions?: { headers: HttpHeaders } }, payload: {}): Observable<object> {
         const getRequest: APIURLHEADER = this.getHttpoptions(apiURLHeader.url);
-        if (!isNullOrUndefined(apiURLHeader.httpOptions)) {
+        if (!this.isNullOrUndefined(apiURLHeader.httpOptions)) {
             return this.http.patch(apiURLHeader.url, payload, apiURLHeader.httpOptions);
         } else {
             return this.http.patch(getRequest.url, payload, getRequest.httpOptions);
@@ -107,7 +109,7 @@ export class RestService {
 
     public putResource(apiURLHeader: { url: string, httpOptions?: { headers: HttpHeaders } }, payload: {}): Observable<object> {
         const getRequest: APIURLHEADER = this.getHttpoptions(apiURLHeader.url);
-        if (!isNullOrUndefined(apiURLHeader.httpOptions)) {
+        if (!this.isNullOrUndefined(apiURLHeader.httpOptions)) {
             return this.http.put(apiURLHeader.url, payload, apiURLHeader.httpOptions);
         } else {
             return this.http.put(getRequest.url, payload, getRequest.httpOptions);
@@ -121,7 +123,7 @@ export class RestService {
 
     public deleteResource(apiURL: string, httpHeaders?: { headers: HttpHeaders }): Observable<object> {
         const getRequest: APIURLHEADER = this.getHttpoptions(apiURL);
-        if (!isNullOrUndefined(httpHeaders)) {
+        if (!this.isNullOrUndefined(httpHeaders)) {
             return this.http.delete(apiURL, httpHeaders);
         } else {
             return this.http.delete(getRequest.url, getRequest.httpOptions);
@@ -141,8 +143,11 @@ export class RestService {
                     this.notifierService.notify('error', err.error.detail !== undefined ?
                         err.error.detail : this.translateService.instant('HTTPERROR.401'));
                 }
-                this.activeModal.dismissAll();
+            } else {
+                this.notifierService.notify('error', err?.error?.detail !== undefined ?
+                    err?.error?.detail : this.translateService.instant('HTTPERROR.401'));
             }
+            this.activeModal.dismissAll();
         } else if (err.error.status === HttpStatus.BAD_REQUEST) {
             this.notifierService.notify('error', err.error.detail !== undefined ?
                 err.error.detail : this.translateService.instant('HTTPERROR.400'));
@@ -177,7 +182,7 @@ export class RestService {
         });
         return {
             url: apiURL,
-            httpOptions: {headers : apiHeaders}
+            httpOptions: { headers: apiHeaders }
         };
     }
 }
index e8eac94..00f0a63 100644 (file)
@@ -18,7 +18,6 @@
 /**
  * @file Provider for Shared Service
  */
-import { isNullOrUndefined } from 'util';
 import { HttpErrorResponse, HttpHeaders } from '@angular/common/http';
 import { EventEmitter, Injectable, Output } from '@angular/core';
 import { FormArray, FormGroup } from '@angular/forms';
@@ -128,9 +127,13 @@ export class SharedService {
     // eslint-disable-next-line @typescript-eslint/no-magic-numbers
     private randomStringLength: number = 4;
 
-    /** Max length of Uint8Array */
+    /** express number for rgb manipulation */
     // eslint-disable-next-line @typescript-eslint/no-magic-numbers
-    private unit8Array: number = 255;
+    private colourHour: number = 10;
+
+    /** express number for rgb manipulation*/
+    // eslint-disable-next-line @typescript-eslint/no-magic-numbers
+    private colourMin: number = 5;
 
     /** Instance of the rest service @private */
     private restService: RestService;
@@ -138,10 +141,6 @@ export class SharedService {
     /** Service holds the router information @private */
     private router: Router;
 
-    /** Random color string generator length @private */
-    // eslint-disable-next-line @typescript-eslint/no-magic-numbers
-    private colorStringLength: number = 256;
-
     /** Check for the root directory @private */
     // eslint-disable-next-line @typescript-eslint/no-magic-numbers
     private directoryCount: number = 2;
@@ -260,10 +259,9 @@ export class SharedService {
 
     /** Generate random string @public */
     public randomString(): string {
-        const chars: string = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
         let result: string = '';
         for (let randomStringRef: number = this.randomStringLength; randomStringRef > 0; --randomStringRef) {
-            result += chars[Math.floor(Math.random() * chars.length)];
+            result += new Date().getSeconds();
         }
         return result;
     }
@@ -414,6 +412,7 @@ export class SharedService {
             const version: string[] = res.version.split('+');
             if (!isNullOrUndefined(version[0])) {
                 this.osmVersion = version[0];
+                sessionStorage.setItem('version', version[0]);
             } else {
                 this.osmVersion = null;
             }
@@ -425,9 +424,9 @@ export class SharedService {
 
     /** Random RGB color code generator @public */
     public generateColor(): string {
-        const x: number = Math.floor(Math.random() * this.colorStringLength);
-        const y: number = Math.floor(Math.random() * this.colorStringLength);
-        const z: number = Math.floor(Math.random() * this.colorStringLength);
+        const x: number = Math.floor((new Date().getHours()) * this.colourHour);
+        const y: number = Math.floor((new Date().getMinutes()) * this.colourMin);
+        const z: number = Math.floor((new Date().getSeconds()) * this.colourMin);
         return 'rgb(' + x + ',' + y + ',' + z + ')';
     }
 
@@ -514,3 +513,8 @@ export class SharedService {
         };
     }
 }
+
+/** Method to handle null or undefined @public */
+// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
+export const isNullOrUndefined = (data: any): boolean => data === null || data === undefined;
+
index c191cf8..5ea6a97 100644 (file)
@@ -25,10 +25,6 @@ import {
 } from '@angular/platform-browser-dynamic/testing';
 import 'zone.js/dist/zone-testing';
 
-/** const variable require */
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-declare const require: any;
-
 // First, initialize the Angular testing environment.
 getTestBed().initTestEnvironment(
     BrowserDynamicTestingModule,
@@ -36,9 +32,3 @@ getTestBed().initTestEnvironment(
     teardown: { destroyAfterEach: false }
 }
 );
-
-/** const variable context */
-// Then we find all the tests.
-const context = require.context('./', true, /\.spec\.ts$/);
-// And load the modules.
-context.keys().map(context);
index b0a4495..d610928 100644 (file)
 {
     "compileOnSave": false,
     "compilerOptions": {
-        "resolveJsonModule": true,
-        "allowSyntheticDefaultImports": true,
-        "baseUrl": ".",
-        "downlevelIteration": true,
-        "outDir": "./dist/out-tsc",
-        "sourceMap": true,
-        "declaration": false,
-        "module": "es2020",
-        "moduleResolution": "node",
-        "emitDecoratorMetadata": true,
-        "experimentalDecorators": true,
-        "importHelpers": true,
-        "target": "es2020",
-        "types": [
-          "node"
-        ],
-        "typeRoots": [
-            "node_modules/@types"
-        ],
-        "lib": [
-            "es2018",
-            "dom"
-        ],
-        "paths": {
-            "CommonModel": ["src/models/CommonModel"],
-            "environment": ["src/environments/environment"],
-            "AuthInterceptorService": ["src/services/AuthInterceptorService"],
-            "RestService": ["src/services/RestService"],
-            "SharedService": ["src/services/SharedService"],
-            "ProjectService": ["src/services/ProjectService"],
-            "DataService": ["src/services/DataService"],
-            "AuthenticationService": ["src/services/AuthenticationService"],
-            "AuthGuardService": ["src/services/AuthGuardService"],
-            "AcessGuardService": ["src/services/AcessGuardService"],
-            "DeviceCheckService": ["src/services/DeviceCheckService"],
-            "NSDModel":["src/models/NSDModel"],
-            "VimAccountModel" : ["src/models/VimAccountModel"],
-            "LayoutComponent": ["src/app/layouts/LayoutComponent"],
-            "SidebarComponent": ["src/app/layouts/sidebar/SidebarComponent"],
-            "HeaderComponent": ["src/app/layouts/header/HeaderComponent"],
-            "UserSettingsComponent": ["src/app/user-settings/UserSettingsComponent"],
-            "LoginComponent": ["src/app/login/LoginComponent"],
-            "DashboardComponent": ["src/app/dashboard/DashboardComponent"],
-            "NSPackages" : ["src/app/packages/ns-packages/NSPackagesComponent"],
-            "NsPackagesAction": ["src/app/utilities/ns-packages-action/NsPackagesActionComponent"],
-            "InstantiateNs": ["src/app/packages/instantiate-ns/InstantiateNsComponent"],
-            "ShowContent": ["src/app/packages/show-content/ShowContentComponent"],
-            "DeleteComponent": ["src/app/utilities/delete/DeleteComponent"],
-            "EditPackagesComponent": ["src/app/utilities/edit-packages/EditPackagesComponent"],
-            "NetsliceTemplate":["src/app/packages/netslice-template/NetsliceTemplateComponent"],
-            "DragDirective": ["src/app/utilities/dragDropUpload/DragDirective"],
-            "NSComposer": ["src/app/packages/ns-packages/ns-composer/NSComposerComponent"],
-            "VNFComposer": ["src/app/packages/ns-packages/vnf-composer/VNFComposerComponent"],
-            "Packages":["src/app/packages/PackagesComponent"],
-            "VNFPackages": ["src/app/packages/vnf-packages/VNFPackagesComponent"],
-            "VNFDModel": ["src/models/VNFDModel"],
-            "VNFPackagesAction" :["src/app/utilities/vnf-packages-action/VNFPackagesActionComponent"],
-            "NetworkSliceModel" : ["src/models/NetworkSliceModel"],
-            "NetslicePackagesAction" : ["src/app/utilities/netslice-packages-action/NetslicePackagesActionComponent"],
-            "PageNotFound" : ["src/app/page-not-found/PageNotFoundComponent"],
-            "ProjectsModule" : ["src/app/projects/ProjectsModule"],
-            "ProjectModel" : ["src/models/ProjectModel"],
-            "ProjectsComponent" : ["src/app/projects/ProjectsComponent"],
-            "ProjectCreateUpdate" : ["src/app/projects/project-create-update/ProjectCreateUpdateComponent"],
-            "ProjectsAction": ["src/app/utilities/projects-action/ProjectsActionComponent"],
-            "BreadCrumb": ["src/app/layouts/breadcrumb/BreadcrumbComponent"],
-            "VNFDEdit": ["src/app/packages/vnfd-edit/VNFDEditComponent"],
-            "VNFInstanceModel": ["src/models/VNFInstanceModel"],
-            "InstancesComponent": ["src/app/instances/InstancesComponent"],
-            "VNFInstancesComponent": ["src/app/instances/vnf-instances/VNFInstancesComponent"],
-            "NSInstancesComponent": ["src/app/instances/ns-instances/NSInstancesComponent"],
-            "HistoryOperationsComponent": ["src/app/instances/ns-history-operations/HistoryOperationsComponent"],
-            "NetsliceInstancesComponent": ["src/app/instances/netslice-instances/NetsliceInstancesComponent"],
-            "VNFInstancesActionComponent": ["src/app/utilities/vnf-instances-action/VNFInstancesActionComponent"],
-            "NSInstancesActionComponent": ["src/app/utilities/ns-instances-action/NSInstancesActionComponent"],
-            "NetsliceInstancesActionComponent": ["src/app/utilities/netslice-instances-action/NetsliceInstancesActionComponent"],
-            "NSInstanceModel": ["src/models/NSInstanceModel"],
-            "ShowInfoComponent": ["src/app/utilities/show-info/ShowInfoComponent"],
-            "NSTopologyComponent": ["src/app/instances/ns-topology/NSTopologyComponent"],
-            "NSTopologyModel": ["src/models/NSTopologyModel"],
-            "SDNControllerComponent": ["src/app/sdn-controller/SDNControllerComponent"],
-            "SDNControllerDetailsComponent": ["src/app/sdn-controller/sdn-controller-details/SDNControllerDetailsComponent"],
-            "SDNControllerInfoComponent": ["src/app/sdn-controller/sdn-controller-info/SDNControllerInfoComponent"],
-            "SDNControllerActionComponent": ["src/app/utilities/sdn-controller-action/SDNControllerActionComponent"],
-            "NewSDNControllerComponent": ["src/app/sdn-controller/new-sdn-controller/NewSDNControllerComponent"],
-            "SDNControllerModel": ["src/models/SDNControllerModel"],
-            "UserModel": ["src/models/UserModel"],
-            "UsersComponent": ["src/app/users/UsersComponent"],
-            "UserDetailsComponent": ["src/app/users/user-details/UserDetailsComponent"],
-            "AddEditUserComponent": ["src/app/users/add-user/AddEditUserComponent"],
-            "UsersActionComponent": ["src/app/utilities/users-action/UsersActionComponent"],
-            "ProjectRoleComponent": ["src/app/users/project-role/ProjectRoleComponent"],
-            "PagePerRow": ["src/app/utilities/page-per-row/PagePerRow"],
-            "PagePerRowModule": ["src/app/utilities/page-per-row/PagePerRowModule"],
-            "VimAccountsModule": ["src/app/vim-accounts/VimAccountsModule"],
-            "VimAccountsComponent": ["src/app/vim-accounts/VimAccountsComponent"],
-            "VimAccountDetails": ["src/app/vim-accounts/vim-account-details/VimAccountDetailsComponent"],
-            "NewVimaccount": ["src/app/vim-accounts/new-vimaccount/NewVimaccountComponent"],
-            "InfoVim": ["src/app/vim-accounts/info-vim/InfoVimComponent"],
-            "VimAccountsAction": ["src/app/utilities/vim-accounts-action/VimAccountsActionComponent"],
-            "InstantiateNetSliceTemplate":["src/app/packages/instantiate-net-slice-template/InstantiateNetSliceTemplateComponent"],
-            "LoaderComponent": ["src/app/utilities/loader/LoaderComponent"],
-            "LoaderModule": ["src/app/utilities/loader/LoaderModule"],
-            "NSPrimitiveComponent": ["src/app/instances/ns-primitive/NSPrimitiveComponent"],
-            "ConfirmationTopology": ["src/app/utilities/confirmation-topology/ConfirmationTopologyComponent"],
-            "ComposePackages": ["src/app/utilities/compose-packages/ComposePackages"],
-            "WIMAccountsAction": ["src/app/utilities/wim-accounts-action/WIMAccountsActionComponent"],
-            "WIMAccountsModule": ["src/app/wim-accounts/WIMAccountsModule"],
-            "WIMAccountsComponent": ["src/app/wim-accounts/WIMAccountsComponent"],
-            "WIMAccountDetails": ["src/app/wim-accounts/wim-account-details/WIMAccountDetailsComponent"],
-            "NewWIMAccount": ["src/app/wim-accounts/new-wim-account/NewWIMAccountComponent"],
-            "WIMAccountInfo": ["src/app/wim-accounts/wim-account-info/WIMAccountInfoComponent"],
-            "WIMAccountModel": ["src/models/WIMAccountModel"],
-            "Roles": ["src/app/roles/RolesComponent"],
-            "RolesDetails": ["src/app/roles/roles-details/RolesDetailsComponent"],
-            "RolesAction": ["src/app/utilities/roles-action/RolesActionComponent"],
-            "RolesCreateEdit": ["src/app/roles/roles-create-edit/RolesCreateEditComponent"],
-            "RolesModel": ["src/models/RoleModel"],
-            "PDUInstancesComponent": ["src/app/instances/pdu-instances/PDUInstancesComponent"],
-            "PDUInstanceModel": ["src/models/PDUInstanceModel"],
-            "PDUInstancesActionComponent": ["src/app/utilities/pdu-instances-action/PDUInstancesActionComponent"],
-            "AddPDUInstancesComponent": ["src/app/instances/pdu-instances/add-pdu-instances/AddPDUInstancesComponent"],
-            "ClonePackage": ["src/app/utilities/clone-package/ClonePackageComponent"],
-            "K8sComponent": ["src/app/k8s/K8sComponent"],
-            "K8sClusterComponent": ["src/app/k8s/k8scluster/K8sClusterComponent"],
-            "K8sRepositoryComponent":["src/app/k8s/k8srepository/K8sRepositoryComponent"],
-            "K8sActionComponent": ["src/app/k8s/k8s-action/K8sActionComponent"],
-            "K8sModel": ["src/models/K8sModel"],
-            "K8sAddClusterComponent": ["src/app/k8s/k8s-add-cluster/K8sAddClusterComponent"],
-            "K8sAddRepoComponent": ["src/app/k8s/k8s-add-repo/K8sAddRepoComponent"],
-            "SwitchProjectComponent": ["src/app/utilities/switch-project/SwitchProjectComponent"],
-            "ProjectLinkComponent":["src/app/utilities/project-link/ProjectLinkComponent"],
-            "PageReload": ["src/app/utilities/page-reload/PageReload"],
-            "PageReloadModule": ["src/app/utilities/page-reload/PageReloadModule"],
-            "GoToTopDirective": ["src/directive/GoToTopDirective"],
-            "VNFLinkComponent": ["src/app/instances/vnf-instances/vnf-link/VNFLinkComponent"],
-            "PACKAGEJSON": ["package.json"],
-            "OsmRepositories" : ["src/app/osm-repositories/OsmRepositoriesComponent"],
-            "OsmRepositoriesDetails":["src/app/osm-repositories/osm-repositories-details/OsmRepositoriesDetailsComponent"],
-            "OsmRepositoriesAction" : ["src/app/utilities/osm-repositories-action/OsmRepositoriesActionComponent"],
-            "OsmRepoModel": ["src/models/OsmRepoModel"],
-            "OsmRepoCreateUpdate": ["src/app/osm-repositories/osm-repo-create-update/OsmRepoCreateUpdateComponent"],
-            "ScalingComponent": ["src/app/utilities/scaling/ScalingComponent"],
-            "OperationalViewComponent": ["src/app/operational-view/OperationalViewComponent"],
-            "OperationalModel": ["src/models/OperationalModel"],
-            "OperationalAppConfigsComponent": ["src/app/operational-view/operational-view-app-configs/OperationalViewAppConfigsComponent"],
-            "OperationalAppActionsComponent": ["src/app/operational-view/operational-view-app-actions/OperationalViewAppActionsComponent"],
-            "OperationalAppExecutedActionsComponent" : ["src/app/operational-view/operational-view-app-executed-actions/OperationalViewAppExecutedActionsComponent"],
-            "ResourcesOverviewComponent": ["src/app/vim-accounts/Resources-Overview/ResourcesOverviewComponent"],
-            "SharedModule": ["src/app/vim-accounts/Resources-Overview/SharedModule"],
-            "ChangePasswordComponent": ["src/app/utilities/change-password/ChangePasswordComponent"],
-            "ChangePasswordModule": ["src/app/utilities/change-password/ChangePasswordModule"],
-            "VmMigrationComponent":  ["src/app/utilities/vm-migration/VmMigrationComponent"],
-            "NsUpdateComponent":  ["src/app/utilities/ns-update/NsUpdateComponent"],
-            "WarningComponent":  ["src/app/utilities/warning/WarningComponent"],
-            "StartStopRebuildComponent":  ["src/app/utilities/start-stop-rebuild/StartStopRebuildComponent"],
-            "VerticalScalingComponent":  ["src/app/utilities/vertical-scaling/VerticalScalingComponent"]
-        }
+      "resolveJsonModule": true,
+      "allowSyntheticDefaultImports": true,
+      "baseUrl": ".",
+      "downlevelIteration": true,
+      "outDir": "./dist/out-tsc",
+      "sourceMap": true,
+      "declaration": false,
+      "module": "es2020",
+      "moduleResolution": "node",
+      "emitDecoratorMetadata": true,
+      "experimentalDecorators": true,
+      "importHelpers": true,
+      "target": "es2021",
+      "types": [
+        "node"
+      ],
+      "typeRoots": [
+        "node_modules/@types"
+      ],
+      "lib": [
+        "es2018",
+        "dom"
+      ],
+      "paths": {
+        "CommonModel": ["src/models/CommonModel"],
+        "environment": ["src/environments/environment"],
+        "AuthInterceptorService": ["src/services/AuthInterceptorService"],
+        "RestService": ["src/services/RestService"],
+        "SharedService": ["src/services/SharedService"],
+        "ProjectService": ["src/services/ProjectService"],
+        "DataService": ["src/services/DataService"],
+        "AuthenticationService": ["src/services/AuthenticationService"],
+        "AuthGuardService": ["src/services/AuthGuardService"],
+        "AcessGuardService": ["src/services/AcessGuardService"],
+        "DeviceCheckService": ["src/services/DeviceCheckService"],
+        "NSDModel": ["src/models/NSDModel"],
+        "VimAccountModel": ["src/models/VimAccountModel"],
+        "LayoutComponent": ["src/app/layouts/LayoutComponent"],
+        "SidebarComponent": ["src/app/layouts/sidebar/SidebarComponent"],
+        "HeaderComponent": ["src/app/layouts/header/HeaderComponent"],
+        "UserSettingsComponent": ["src/app/user-settings/UserSettingsComponent"],
+        "LoginComponent": ["src/app/login/LoginComponent"],
+        "DashboardComponent": ["src/app/dashboard/DashboardComponent"],
+        "NSPackages": ["src/app/packages/ns-packages/NSPackagesComponent"],
+        "NsPackagesAction": ["src/app/utilities/ns-packages-action/NsPackagesActionComponent"],
+        "InstantiateNs": ["src/app/packages/instantiate-ns/InstantiateNsComponent"],
+        "ShowContent": ["src/app/packages/show-content/ShowContentComponent"],
+        "DeleteComponent": ["src/app/utilities/delete/DeleteComponent"],
+        "EditPackagesComponent": ["src/app/utilities/edit-packages/EditPackagesComponent"],
+        "NetsliceTemplate": ["src/app/packages/netslice-template/NetsliceTemplateComponent"],
+        "DragDirective": ["src/app/utilities/dragDropUpload/DragDirective"],
+        "NSComposer": ["src/app/packages/ns-packages/ns-composer/NSComposerComponent"],
+        "VNFComposer": ["src/app/packages/ns-packages/vnf-composer/VNFComposerComponent"],
+        "Packages": ["src/app/packages/PackagesComponent"],
+        "VNFPackages": ["src/app/packages/vnf-packages/VNFPackagesComponent"],
+        "VNFDModel": ["src/models/VNFDModel"],
+        "VNFPackagesAction": ["src/app/utilities/vnf-packages-action/VNFPackagesActionComponent"],
+        "NetworkSliceModel": ["src/models/NetworkSliceModel"],
+        "NetslicePackagesAction": ["src/app/utilities/netslice-packages-action/NetslicePackagesActionComponent"],
+        "PageNotFound": ["src/app/page-not-found/PageNotFoundComponent"],
+        "ProjectsModule": ["src/app/projects/ProjectsModule"],
+        "ProjectModel": ["src/models/ProjectModel"],
+        "ProjectsComponent": ["src/app/projects/ProjectsComponent"],
+        "ProjectCreateUpdate": ["src/app/projects/project-create-update/ProjectCreateUpdateComponent"],
+        "ProjectsAction": ["src/app/utilities/projects-action/ProjectsActionComponent"],
+        "BreadCrumb": ["src/app/layouts/breadcrumb/BreadcrumbComponent"],
+        "VNFDEdit": ["src/app/packages/vnfd-edit/VNFDEditComponent"],
+        "VNFInstanceModel": ["src/models/VNFInstanceModel"],
+        "InstancesComponent": ["src/app/instances/InstancesComponent"],
+        "VNFInstancesComponent": ["src/app/instances/vnf-instances/VNFInstancesComponent"],
+        "NSInstancesComponent": ["src/app/instances/ns-instances/NSInstancesComponent"],
+        "HistoryOperationsComponent": ["src/app/instances/ns-history-operations/HistoryOperationsComponent"],
+        "NetsliceInstancesComponent": ["src/app/instances/netslice-instances/NetsliceInstancesComponent"],
+        "VNFInstancesActionComponent": ["src/app/utilities/vnf-instances-action/VNFInstancesActionComponent"],
+        "NSInstancesActionComponent": ["src/app/utilities/ns-instances-action/NSInstancesActionComponent"],
+        "NetsliceInstancesActionComponent": ["src/app/utilities/netslice-instances-action/NetsliceInstancesActionComponent"],
+        "NSInstanceModel": ["src/models/NSInstanceModel"],
+        "ShowInfoComponent": ["src/app/utilities/show-info/ShowInfoComponent"],
+        "NSTopologyComponent": ["src/app/instances/ns-topology/NSTopologyComponent"],
+        "NSTopologyModel": ["src/models/NSTopologyModel"],
+        "SDNControllerComponent": ["src/app/sdn-controller/SDNControllerComponent"],
+        "SDNControllerDetailsComponent": ["src/app/sdn-controller/sdn-controller-details/SDNControllerDetailsComponent"],
+        "SDNControllerInfoComponent": ["src/app/sdn-controller/sdn-controller-info/SDNControllerInfoComponent"],
+        "SDNControllerActionComponent": ["src/app/utilities/sdn-controller-action/SDNControllerActionComponent"],
+        "NewSDNControllerComponent": ["src/app/sdn-controller/new-sdn-controller/NewSDNControllerComponent"],
+        "SDNControllerModel": ["src/models/SDNControllerModel"],
+        "UserModel": ["src/models/UserModel"],
+        "UsersComponent": ["src/app/users/UsersComponent"],
+        "UserDetailsComponent": ["src/app/users/user-details/UserDetailsComponent"],
+        "AddEditUserComponent": ["src/app/users/add-user/AddEditUserComponent"],
+        "UsersActionComponent": ["src/app/utilities/users-action/UsersActionComponent"],
+        "ProjectRoleComponent": ["src/app/users/project-role/ProjectRoleComponent"],
+        "PagePerRow": ["src/app/utilities/page-per-row/PagePerRow"],
+        "PagePerRowModule": ["src/app/utilities/page-per-row/PagePerRowModule"],
+        "VimAccountsModule": ["src/app/vim-accounts/VimAccountsModule"],
+        "VimAccountsComponent": ["src/app/vim-accounts/VimAccountsComponent"],
+        "VimAccountDetails": ["src/app/vim-accounts/vim-account-details/VimAccountDetailsComponent"],
+        "NewVimaccount": ["src/app/vim-accounts/new-vimaccount/NewVimaccountComponent"],
+        "InfoVim": ["src/app/vim-accounts/info-vim/InfoVimComponent"],
+        "VimAccountsAction": ["src/app/utilities/vim-accounts-action/VimAccountsActionComponent"],
+        "InstantiateNetSliceTemplate": ["src/app/packages/instantiate-net-slice-template/InstantiateNetSliceTemplateComponent"],
+        "LoaderComponent": ["src/app/utilities/loader/LoaderComponent"],
+        "LoaderModule": ["src/app/utilities/loader/LoaderModule"],
+        "NSPrimitiveComponent": ["src/app/instances/ns-primitive/NSPrimitiveComponent"],
+        "ConfirmationTopology": ["src/app/utilities/confirmation-topology/ConfirmationTopologyComponent"],
+        "ComposePackages": ["src/app/utilities/compose-packages/ComposePackages"],
+        "WIMAccountsAction": ["src/app/utilities/wim-accounts-action/WIMAccountsActionComponent"],
+        "WIMAccountsModule": ["src/app/wim-accounts/WIMAccountsModule"],
+        "WIMAccountsComponent": ["src/app/wim-accounts/WIMAccountsComponent"],
+        "WIMAccountDetails": ["src/app/wim-accounts/wim-account-details/WIMAccountDetailsComponent"],
+        "NewWIMAccount": ["src/app/wim-accounts/new-wim-account/NewWIMAccountComponent"],
+        "WIMAccountInfo": ["src/app/wim-accounts/wim-account-info/WIMAccountInfoComponent"],
+        "WIMAccountModel": ["src/models/WIMAccountModel"],
+        "Roles": ["src/app/roles/RolesComponent"],
+        "RolesDetails": ["src/app/roles/roles-details/RolesDetailsComponent"],
+        "RolesAction": ["src/app/utilities/roles-action/RolesActionComponent"],
+        "RolesCreateEdit": ["src/app/roles/roles-create-edit/RolesCreateEditComponent"],
+        "RolesModel": ["src/models/RoleModel"],
+        "PDUInstancesComponent": ["src/app/instances/pdu-instances/PDUInstancesComponent"],
+        "PDUInstanceModel": ["src/models/PDUInstanceModel"],
+        "PDUInstancesActionComponent": ["src/app/utilities/pdu-instances-action/PDUInstancesActionComponent"],
+        "AddPDUInstancesComponent": ["src/app/instances/pdu-instances/add-pdu-instances/AddPDUInstancesComponent"],
+        "ClonePackage": ["src/app/utilities/clone-package/ClonePackageComponent"],
+        "K8sComponent": ["src/app/k8s/K8sComponent"],
+        "K8sClusterComponent": ["src/app/k8s/k8scluster/K8sClusterComponent"],
+        "K8sRepositoryComponent": ["src/app/k8s/k8srepository/K8sRepositoryComponent"],
+        "K8sActionComponent": ["src/app/k8s/k8s-action/K8sActionComponent"],
+        "K8sModel": ["src/models/K8sModel"],
+        "K8sAddClusterComponent": ["src/app/k8s/k8s-add-cluster/K8sAddClusterComponent"],
+        "K8sAddRepoComponent": ["src/app/k8s/k8s-add-repo/K8sAddRepoComponent"],
+        "SwitchProjectComponent": ["src/app/utilities/switch-project/SwitchProjectComponent"],
+        "ProjectLinkComponent": ["src/app/utilities/project-link/ProjectLinkComponent"],
+        "PageReload": ["src/app/utilities/page-reload/PageReload"],
+        "PageReloadModule": ["src/app/utilities/page-reload/PageReloadModule"],
+        "GoToTopDirective": ["src/directive/GoToTopDirective"],
+        "VNFLinkComponent": ["src/app/instances/vnf-instances/vnf-link/VNFLinkComponent"],
+        "PACKAGEJSON": ["package.json"],
+        "OsmRepositories": ["src/app/osm-repositories/OsmRepositoriesComponent"],
+        "OsmRepositoriesDetails": ["src/app/osm-repositories/osm-repositories-details/OsmRepositoriesDetailsComponent"],
+        "OsmRepositoriesAction": ["src/app/utilities/osm-repositories-action/OsmRepositoriesActionComponent"],
+        "OsmRepoModel": ["src/models/OsmRepoModel"],
+        "OsmRepoCreateUpdate": ["src/app/osm-repositories/osm-repo-create-update/OsmRepoCreateUpdateComponent"],
+        "ScalingComponent": ["src/app/utilities/scaling/ScalingComponent"],
+        "OperationalViewComponent": ["src/app/operational-view/OperationalViewComponent"],
+        "OperationalModel": ["src/models/OperationalModel"],
+        "OperationalAppConfigsComponent": ["src/app/operational-view/operational-view-app-configs/OperationalViewAppConfigsComponent"],
+        "OperationalAppActionsComponent": ["src/app/operational-view/operational-view-app-actions/OperationalViewAppActionsComponent"],
+        "OperationalAppExecutedActionsComponent": ["src/app/operational-view/operational-view-app-executed-actions/OperationalViewAppExecutedActionsComponent"],
+        "ResourcesOverviewComponent": ["src/app/vim-accounts/Resources-Overview/ResourcesOverviewComponent"],
+        "SharedModule": ["src/app/vim-accounts/Resources-Overview/SharedModule"],
+        "ChangePasswordComponent": ["src/app/utilities/change-password/ChangePasswordComponent"],
+        "ChangePasswordModule": ["src/app/utilities/change-password/ChangePasswordModule"],
+        "VmMigrationComponent": ["src/app/utilities/vm-migration/VmMigrationComponent"],
+        "NsUpdateComponent": ["src/app/utilities/ns-update/NsUpdateComponent"],
+        "WarningComponent": ["src/app/utilities/warning/WarningComponent"],
+        "StartStopRebuildComponent": ["src/app/utilities/start-stop-rebuild/StartStopRebuildComponent"],
+        "VerticalScalingComponent": ["src/app/utilities/vertical-scaling/VerticalScalingComponent"],
+        "HealingComponent": ["src/app/utilities/healing/HealingComponent"]
+      },
+      "useDefineForClassFields": false
     }
-}
\ No newline at end of file
+  }
\ No newline at end of file