summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usecaseui-portal/package.json1
-rw-r--r--usecaseui-portal/src/app/app-routing.module.ts9
-rw-r--r--usecaseui-portal/src/app/app.component.html4
-rw-r--r--usecaseui-portal/src/app/app.module.ts10
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.html197
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.less208
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.spec.ts25
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.ts310
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.html43
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.less98
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.spec.ts25
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.ts330
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.html204
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.less59
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.spec.ts25
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.ts197
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.html17
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.less3
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.spec.ts25
-rw-r--r--usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.ts25
-rw-r--r--usecaseui-portal/src/assets/i18n/cn.json14
-rw-r--r--usecaseui-portal/src/assets/i18n/en.json14
-rw-r--r--usecaseui-portal/src/assets/images/edge.pngbin0 -> 626284 bytes
-rw-r--r--usecaseui-portal/src/assets/images/logicallink.pngbin0 -> 5072 bytes
-rw-r--r--usecaseui-portal/src/assets/images/tpoint.pngbin0 -> 7187 bytes
25 files changed, 1839 insertions, 4 deletions
diff --git a/usecaseui-portal/package.json b/usecaseui-portal/package.json
index 5e75e09b..201921a6 100644
--- a/usecaseui-portal/package.json
+++ b/usecaseui-portal/package.json
@@ -39,6 +39,7 @@
"ng-zorro-antd": "^0.7.1",
"ngx-echarts": "^2.2.0",
"rxjs": "^5.5.12",
+ "vis": "^4.21.0",
"zone.js": "^0.8.19"
},
"devDependencies": {
diff --git a/usecaseui-portal/src/app/app-routing.module.ts b/usecaseui-portal/src/app/app-routing.module.ts
index 8c8bf2e8..e3be9e84 100644
--- a/usecaseui-portal/src/app/app-routing.module.ts
+++ b/usecaseui-portal/src/app/app-routing.module.ts
@@ -30,6 +30,10 @@ import { PerformanceVnfComponent } from './views/performance/performance-vnf/per
import { PerformanceVmComponent } from './views/performance/performance-vm/performance-vm.component';
import { CcvpnNetworkComponent } from './views/ccvpn-network/ccvpn-network.component';
+import { SotnManagementComponent } from './views/services/sotn-management/sotn-management.component';
+import { OrderServiceComponent } from './views/services/sotn-management/order-service/order-service.component';
+import { ManageServiceComponent } from './views/services/sotn-management/manage-service/manage-service.component';
+import { MonitorServiceComponent } from './views/services/sotn-management/monitor-service/monitor-service.component';
import { TestComponent } from './test/test.component';
@@ -50,7 +54,10 @@ const routes: Routes = [
{ path: 'fcaps/5gslicing', component: Monitor5gComponent },
{ path: 'services/services-list', component: ServicesListComponent },
{ path: 'services/slicing-management', component: SlicingManagementComponent },
- // { path: 'services/onboard-vnf-vm', component: OnboardVnfVmComponent },
+ { path: 'services/sotn-management', component: SotnManagementComponent },
+ { path: 'services/order-service', component: OrderServiceComponent },
+ { path: 'services/manage-service', component: ManageServiceComponent },
+ { path: 'services/monitor-service', component: MonitorServiceComponent },
{ path: 'onboard-vnf-vm', component: OnboardVnfVmComponent },
{ path: 'alarm', component: AlarmComponent },
{ path: 'performance', component: PerformanceComponent },
diff --git a/usecaseui-portal/src/app/app.component.html b/usecaseui-portal/src/app/app.component.html
index c64bf307..32e3fc08 100644
--- a/usecaseui-portal/src/app/app.component.html
+++ b/usecaseui-portal/src/app/app.component.html
@@ -61,6 +61,10 @@
<li nz-menu-item [ngClass]="{'activeMenuList': url === 'services/services-list'}">
<a routerLink='services/services-list'> {{"i18nTextDefine_ServicesList" | translate}} </a>
</li>
+ <!-- SOTN ELine -->
+ <li nz-menu-item [ngClass]="{'activeMenuList': url === 'services/sotn-management'}">
+ <a routerLink='services/sotn-management'> {{"i18nTextDefine_SotnEline" | translate}} </a>
+ </li>
<!-- 5g slicing management -->
<li nz-menu-item [ngClass]="{'activeMenuList': url === 'services/slicing-management'}">
<a routerLink='services/slicing-management'> {{"i18nTextDefine_Mangement_5g" | translate}} </a>
diff --git a/usecaseui-portal/src/app/app.module.ts b/usecaseui-portal/src/app/app.module.ts
index 5fa37be6..8868cad6 100644
--- a/usecaseui-portal/src/app/app.module.ts
+++ b/usecaseui-portal/src/app/app.module.ts
@@ -103,6 +103,10 @@ import { NsiModelComponent } from './views/services/slicing-management/slicing-r
import { NssiModelComponent } from './views/services/slicing-management/slicing-resource-management/nssi-management/nssi-model/nssi-model.component';
import { CsmfSlicingBusinessManagementComponent } from './views/services/slicing-management/csmf-slicing-business-management/csmf-slicing-business-management.component';
import { BusinessOrderComponent } from './views/services/slicing-management/csmf-slicing-business-management/business-order/business-order.component';
+import { SotnManagementComponent } from './views/services/sotn-management/sotn-management.component';
+import { OrderServiceComponent } from './views/services/sotn-management/order-service/order-service.component';
+import { ManageServiceComponent } from './views/services/sotn-management/manage-service/manage-service.component';
+import { MonitorServiceComponent } from './views/services/sotn-management/monitor-service/monitor-service.component';
@NgModule({
providers: [
@@ -168,7 +172,11 @@ import { BusinessOrderComponent } from './views/services/slicing-management/csmf
BusinessOrderComponent,
MdonsCreationComponent,
MdonsDetailComponent,
- DisableControlDirective
+ DisableControlDirective,
+ SotnManagementComponent,
+ OrderServiceComponent,
+ ManageServiceComponent,
+ MonitorServiceComponent
],
imports: [
BrowserModule,
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.html b/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.html
new file mode 100644
index 00000000..b7d75ad4
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.html
@@ -0,0 +1,197 @@
+<div class="main">
+ <div class="divCls">
+ <table>
+ <tr>
+ <td>
+ <nz-form-label class="colm-s-1 lblCls" [nzSm]="6" [nzXs]="24" nzRequired nzFor="capacity">{{"i18nTextDefine_subscriptionType" | translate}}</nz-form-label>
+ </td>
+ <td>
+ <nz-select class="colm-s-2" id="subscriptionType" [(ngModel)]="selectedSubscriptionType" (ngModelChange)="getServiceInstanceList($event)" nzAllowClear
+ nzPlaceHolder="Choose">
+ <nz-option *ngFor="let option of serviceSubscriptionList" [nzValue]="option.serviceType" [nzLabel]="option.serviceType"></nz-option>
+ </nz-select>
+ </td>
+ <td style="width: 5%"></td>
+ <td>
+ <nz-form-label class="colm-s-1 lblCls" [nzSm]="6" [nzXs]="24" nzRequired nzFor="capacity">{{"i18nTextDefine_serviceInstance" | translate}}</nz-form-label>
+ </td>
+ <td>
+ <nz-select class="colm-s-2" id="serviceInstance" [(ngModel)]="selectedServiceInstance" (ngModelChange)="getSubscribedSites($event)" nzAllowClear
+ nzPlaceHolder="Choose">
+ <nz-option *ngFor="let option of serviceInstanceList" [nzValue]="option.serviceInstance" [nzLabel]="option.serviceInstancename"></nz-option>
+ </nz-select>
+ </td>
+ <td style="width: 5%"></td>
+ <td>
+ <button *ngIf="((selectedSubscriptionType|lowercase) == 'sotn' && selectedServiceInstance !='' )" nz-button nzType="primary"
+ (click)="deleteSelectedService()">{{"i18nTextDefine_delete" | translate}}</button>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div class="desktop view">
+ <nz-table #nzExpandTable [nzData]="expandDataSet" [nzShowPagination]=false>
+ <tbody>
+ <ng-template ngFor let-data [ngForOf]="nzExpandTable.data">
+ <tr>
+ <td width="4%" class="tdCls" nzShowExpand [(nzExpand)]="data.expand"></td>
+ <td width="96%" class="tdCls">{{data.name | translate}}</td>
+ </tr>
+ <tr [nzExpand]="data.expand">
+ <td class="noPadding" colspan="2">
+ <ng-template [ngIf]="data.rowIdx == 1">
+ <div style="display: flex; justify-content: center; padding: 1%;">
+ <div style="width: 45%" class="">
+ <div style="padding: 1%">
+ <span>
+ <b>Name: </b>
+ </span>
+ <span>{{summaryInfo.name}}</span>
+ </div>
+ </div>
+ <div style="width: 45%" class="">
+ <div style="padding: 1%">
+ <span>
+ <b>Description: </b>
+ </span>
+ <span>{{summaryInfo.description}}</span>
+ </div>
+ </div>
+ </div>
+ </ng-template>
+ <ng-template [ngIf]="data.rowIdx == 2">
+ <div style="display: flex; justify-content: center; padding: 1%;">
+ <div style="width: 45%" class="">
+ <div style="padding: 1%">
+ <span>
+ <b>Name: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_name}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>Description: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_description}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>COS: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_COS}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>Dual Link: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_dualLink}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>Tenant ID: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_tenantId}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>VPN Type: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_vpnType}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>CBC: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_cbs}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>EBC: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_ebs}}</span>
+ </div>
+ </div>
+ <div style="width: 45%" class="">
+ <div style="padding: 1%">
+ <span>
+ <b>Color Aware: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_colorAware}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>Re-route: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_reroute}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>Coupling Flag: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_couplingFlag}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>CIR: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_cir}}</span>
+ </div>
+
+ <div style="padding: 1%">
+ <span>
+ <b>Start Time: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_startTime}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>End Time: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_endTime}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>EIR: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_eir}}</span>
+ </div>
+ <div style="padding: 1%">
+ <span>
+ <b>SLS: </b>
+ </span>
+ <span>{{vpnInfo.l2vpn_SLS}}</span>
+ </div>
+
+ </div>
+ </div>
+ </ng-template>
+ <ng-template [ngIf]="data.rowIdx == 3">
+ <div style="display: flex; justify-content: center; padding: 1%;">
+ <div style="width: 90%" class="">
+ <nz-table #basicTable [nzData]="uniInfo" [nzShowPagination]="false">
+ <thead>
+ <tr>
+ <th>UNI</th>
+ <th>TP Id</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr *ngFor="let data of basicTable.data">
+ <td>{{ data.sotnuni_cVLAN }}</td>
+ <td>{{ data.sotnuni_tpId }}</td>
+ </tr>
+ </tbody>
+ </nz-table>
+ </div>
+ </div>
+ </ng-template>
+ </td>
+ </tr>
+ </ng-template>
+ </tbody>
+ </nz-table>
+ </div>
+ <!-- <app-sotn-order-service *ngIf="((selectedSubscriptionType|lowercase) == 'sotn' && selectedServiceInstance !='' )" [subscriptionType]="selectedSubscriptionType"
+ [serviceInstanceId]="selectedServiceInstance"></app-sotn-order-service>
+ <app-ordered-service *ngIf="((selectedSubscriptionType|lowercase) == 'sdwan' && selectedServiceInstance !='' )"></app-ordered-service> -->
+</div> \ No newline at end of file
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.less b/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.less
new file mode 100644
index 00000000..92fff32e
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.less
@@ -0,0 +1,208 @@
+.main {
+ min-height: calc(~"100vh - 165px");
+}
+.paddingLeft{
+ padding-left: 40px;
+ }
+ nz-table{
+
+
+
+ td{
+ border-bottom: 1px solid #F7F8FC;
+ background-color:var(--primary) ;
+ color: var(--on-primary) ;
+ }
+ .tdCls{
+ font-weight:bold;
+ color: var(--on-primary) ;
+ background-color:var(--primary) ;
+ }
+ .Clscol
+ {
+ color: var(--on-primary) ;
+ }
+
+ .thCls{
+ font-weight:bold;
+ color: var(--on-primary) ;
+ background-color: var(--th-background);
+
+ border-bottom: 1px solid #F7F8FC;
+ border-top: 1px solid #F7F8FC;
+ }
+ .noPadding
+ {
+ padding-left:0px;
+ padding-right:0px;
+ }
+ .costCls{
+ margin-left: 40%;
+ // padding-left: 20px;
+ color: red;
+ }
+ .costCls_mob{
+ color: red;
+ }
+ .divCls{
+ display: inline-block;
+ width: 40%;
+ padding-left: 3%;
+ padding-bottom: 10px;
+ color : var(--on-lables) ;
+ }
+ .spanCls
+ {
+ color:#999999;
+ }
+
+ .textAlignLeft
+ {
+ text-align: left;
+ }
+ .paddingZero{
+ padding:0px;
+ }
+ }
+
+ .container
+ {
+ height: calc(~"100vh - 120px");
+ overflow: auto;
+ }
+
+ :host ::ng-deep .ant-table-row-expand-icon
+ { background: var(--primary);
+
+ }
+ .divCls
+ {
+ .spanCls {
+ color : var(--on-lables) ;
+ }}
+
+ .inner_data
+ {
+ padding-left: 52px;
+ }
+
+.paddingLeft{
+ padding-left: 40px;
+}
+nz-table{
+ td{
+ border-bottom: 1px solid #F7F8FC;
+ background-color:var(--primary) ;
+ color: var(--on-primary) ;
+ }
+ .tdCls{
+ font-weight:bold;
+ color: var(--on-primary) ;
+ background-color:var(--primary) ;
+ overflow: hidden;
+ height:21px;
+ }
+ .clscol
+ {
+ color: var(--on-primary) ;
+ }
+
+ .thCls{
+ font-weight:bold;
+ color: var(--on-primary) ;
+ background-color: var(--th-background);
+
+ border-bottom: 1px solid #F7F8FC;
+ border-top: 1px solid #F7F8FC;
+ height:21px;
+ }
+ .noPadding
+ {
+ padding-left:0px;
+ padding-right:0px;
+ }
+
+ .divCls{
+ display: inline-block;
+ width: 40%;
+ padding-left: 3%;
+ padding-bottom: 10px;
+ color : var(--on-lables) ;
+ }
+ .spanCls
+ {
+ color:#999999;
+ }
+ .costCls
+ {
+ color:red;
+ text-align: center;
+ font-size: 16px;
+ font-weight:400;
+ border:0px;
+ }
+ .textAlignLeft
+ {
+ text-align: left;
+ }
+ .paddingZero{
+ padding:0px;
+ }
+}
+
+.container1
+{
+ height: calc(~"100vh - 210px");
+ overflow: auto;
+}
+
+:host ::ng-deep .ant-table-row-expand-icon
+{ background: var(--primary);
+
+}
+.divCls
+{
+.spanCls {
+ color : var(--on-lables) ;
+}}
+
+@media (max-width: 575px) {
+
+
+ .xs-clr-blue{
+ color: var(--on-primary) ;
+ }
+ .xs-clr-red{
+ color: red!important;
+ }
+ .xs-flex-col{
+ display: flex!important;
+ flex-direction: column!important;
+ }
+
+ .text-align-center{
+ text-align: center!important
+ }
+ .min-hight{
+ min-height: calc(~"50vh - 50px")!important;
+ }
+
+}
+
+.divCls{
+ display: inline-block;
+ width: 100%;
+ padding-bottom: 10px;
+ color : var(--on-lables) ;
+ }
+
+ .main {
+ padding-left:80px
+ }
+ .ant-col-sm-6 {
+ width:100%;
+ }
+
+ #subscriptionType, #serviceInstance {
+ width: 250px;
+ } \ No newline at end of file
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.spec.ts b/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.spec.ts
new file mode 100644
index 00000000..2d0b9902
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ManageServiceComponent } from './manage-service.component';
+
+describe('ManageServiceComponent', () => {
+ let component: ManageServiceComponent;
+ let fixture: ComponentFixture<ManageServiceComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ ManageServiceComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ManageServiceComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.ts b/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.ts
new file mode 100644
index 00000000..d3143e82
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/manage-service/manage-service.component.ts
@@ -0,0 +1,310 @@
+import { Component, OnInit, SimpleChanges } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http';
+
+@Component({
+ selector: 'app-manage-service',
+ templateUrl: './manage-service.component.html',
+ styleUrls: ['./manage-service.component.less']
+})
+export class ManageServiceComponent implements OnInit {
+
+ selectedSubscriptionType:string = "SOTN";
+ serviceSubscriptionList:any = [{
+ serviceType:"SOTN"
+ }];
+ selectedServiceInstance:string = "";
+ serviceInstanceList:any = [
+ {
+ serviceInstance: "SiteService-5011",
+ serviceInstancename: "SiteService-5011"
+ },
+ {
+ serviceInstance: "ISAAC-IS0333",
+ serviceInstancename: "ISAAC-IS0333"
+ }
+ ];
+ graphData: boolean = true;
+ expandDataSet = [
+ { rowIdx: 1, name: 'Service',cost: '', expand: true , mobileExpand:false},
+ { rowIdx: 2, name: 'VPN',cost: '', expand: true,mobileExpand:false },
+ { rowIdx: 3, name: 'UNI',cost: '', expand: true,mobileExpand:false }
+ ];
+
+ summaryInfo:object = {};
+ serviceList:object = {};
+ vpnInfo = [];
+ uniInfo = [];
+ mapped: any;
+ myKeys = [] as Array<any>;
+ baseUrl:string = '/api/usecaseui-server/v1'
+ constructor(private http: HttpClient) { }
+
+ ngOnInit() {
+ this.getSubscribeTypes();
+ }
+
+ //Get SubscriptionType
+ getSubscribeTypes() {
+ let url = this.baseUrl + "/uui-lcm/customers/service-subscriptions";
+ // this.http.get<any>(url, {}).subscribe((data) => {
+ // this.serviceSubscriptionList = data.subscriptions;
+ // this.selectedSubscriptionType = this.serviceSubscriptionList[0].serviceType;
+ // this.getServiceInstanceList(this.selectedSubscriptionType);
+ // }, (err) => {
+ // console.log(err);
+ // });
+ let data = {
+ "subscriptions": [
+ {
+ "serviceType": "SOTN",
+ }]
+ }
+ this.serviceSubscriptionList = data.subscriptions;
+ this.selectedSubscriptionType = this.serviceSubscriptionList[0].serviceType;
+ this.getServiceInstanceList(this.selectedSubscriptionType);
+ }
+
+ //Get subscription instanceID by calling With Subscription Type
+ getServiceInstanceList(subscriptionType) {
+ this.serviceInstanceList = [];
+ this.selectedServiceInstance="";
+ let url = this.baseUrl + "/uui-lcm/Sotnservices/ServiceInstances/"+subscriptionType;
+ // this.http.get<any>(url,{}).subscribe((data) => {
+ // this.serviceInstanceList = data.serviceInstanceList;
+ // this.selectedServiceInstance = data.serviceInstanceList[0].serviceInstance;
+ // this.getSubscribedSites(data.serviceInstanceList[0]);
+ // this.graphData = false;
+ // }, (err) => {
+ // console.log(err);
+ // });
+ let data = {
+ "serviceInstanceList": [
+ {
+ "serviceInstance": "ISAAC-IS02",
+ "serviceInstancename":"SiteService-5011"
+ },
+ {
+ "serviceInstance": "ISAAC-IS03",
+ "serviceInstancename":"ISAAC-IS0333"
+ }
+ ]
+ }
+ this.serviceInstanceList = data.serviceInstanceList;
+ this.selectedServiceInstance = data.serviceInstanceList[0].serviceInstance;
+ this.getSubscribedSites(data.serviceInstanceList[0]);
+
+ // var datas= {
+ // "ethtSvcName":"vpn022",
+ // "colorAware":"true",
+ // "cbs":"100",
+ // "couplingFlag":"true",
+ // "ebs":"EVPL",
+ // "cir":"98900",
+ // "eir":"1000",
+ // "vpnInformations":[{
+ // "vpnThreshold":"1000",
+ // "vpnBandwidth":"100",
+ // "vpnType":"Hub-Spoke",
+ // "vpnId":"a8529dee-523e-4c6b-bc83-e26d68a9911c",
+ // "vpnName":"vpn022",
+ // "sites":[
+ // {
+ // "zipCode":"100008",
+ // "address":"beijing",
+ // "siteId":"d5b530fe-2271-4ed6-8c09-b7ce368a1f59",
+ // "siteName":"ISAAC01-hub1",
+ // "description":"desc"
+ // }
+ // ]
+ // }]
+ // };
+ // this.assignData(datas, false);
+ var datas = {
+ "service":{
+ "name":"CCVPNServiceV2-36",
+ "description":"CCVPNServiceV2",
+ "serviceInvariantUuid":"57c8a933-1364-4f85-b7a9-666d80ecc5b6",
+ "serviceUuid":"0734e398-a427-49f2-9abe-de8eb02542ad",
+ "globalSubscriberId": "{{customer}}",
+ "serviceType": "{{service-subscription}}",
+ "parameters":{
+ "locationConstraints":[],
+ "resources":[],
+ "requestInputs":{
+ "sotnUnderlay":[
+ {
+ l2vpn:[
+ {
+ "l2vpn_COS": "123",
+ "l2vpn_dualLink": "Yes",
+ "l2vpn_description": "VPN Description",
+ "l2vpn_name": "VPN2",
+ "l2vpn_tenantId": "989933",
+ "l2vpn_vpnType": "SOTN",
+ "l2vpn_cbs": "123",
+ "l2vpn_ebs": "23",
+ "l2vpn_colorAware": "true",
+ "l2vpn_reroute": "Yes",
+ "l2vpn_couplingFlag": "true",
+ "l2vpn_cir": "100",
+ "l2vpn_startTime": "28-02-2020",
+ "l2vpn_endTime": "21-02-2020",
+ "l2vpn_eir": "1000",
+ "l2vpn_SLS": "1234"
+ }
+ ],
+ "sotnUni":[
+ {
+ "sotnuni_cVLAN": "Huawei",
+ "sotnuni_tpId": "Huawei-112233"
+ },
+ {
+ "sotnuni_cVLAN": "Huawei-1",
+ "sotnuni_tpId": "Huawei1-554433"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ this.assignData(datas, false);
+ }
+
+ getSubscribedSites(selectedServiceInstance) {}
+
+ deleteSelectedService()
+ {
+
+ let url = this.baseUrl + "/uui-lcm/Sotnservices/servicesubscription/"+this.selectedSubscriptionType+'/serviceinstance/'+this.selectedServiceInstance;
+
+ // this.http.delete<any>(url,{}).subscribe((data) => {
+ // this.serviceInstanceList = [];
+ // this.selectedServiceInstance = "";
+ // this.getServiceInstanceList(this.selectedSubscriptionType);
+ // }, (err) => {
+ // console.log(err);
+ // });
+ }
+
+
+ ngOnChanges(changes: SimpleChanges) {
+ console.log("on change");
+ if (this.selectedServiceInstance) {
+ // let url = this.baseUrl + "/uui-lcm/Sotnservices/servicesubscription/"+this.selectedSubscriptionType+'/serviceinstance/'+this.selectedServiceInstance;
+ // this.http.get<any>(url, {}).subscribe((data) => {
+ // this.assignData(data, false);
+ // }, (err) => {
+ // console.log(err);
+ // });
+ // var data= {
+ // "ethtSvcName":"vpn022",
+ // "colorAware":"true",
+ // "cbs":"100",
+ // "couplingFlag":"true",
+ // "ebs":"EVPL",
+ // "cir":"98900",
+ // "eir":"1000",
+ // "vpnInformations":[{
+ // "vpnThreshold":"1000",
+ // "vpnBandwidth":"100",
+ // "vpnType":"Hub-Spoke",
+ // "vpnId":"a8529dee-523e-4c6b-bc83-e26d68a9911c",
+ // "vpnName":"vpn022",
+ // "sites":[
+ // {
+ // "zipCode":"100008",
+ // "address":"beijing",
+ // "siteId":"d5b530fe-2271-4ed6-8c09-b7ce368a1f59",
+ // "siteName":"ISAAC01-hub1",
+ // "description":"desc"
+ // }
+ // ]
+ // }]
+ // };
+ var datas = {
+ "service":{
+ "name":"CCVPNServiceV2-36",
+ "description":"CCVPNServiceV2",
+ "serviceInvariantUuid":"57c8a933-1364-4f85-b7a9-666d80ecc5b6",
+ "serviceUuid":"0734e398-a427-49f2-9abe-de8eb02542ad",
+ "globalSubscriberId": "{{customer}}",
+ "serviceType": "{{service-subscription}}",
+ "parameters":{
+ "locationConstraints":[],
+ "resources":[],
+ "requestInputs":{
+ "sotnUnderlay":[
+ {
+ l2vpn:[
+ {
+ "l2vpn_COS": "123",
+ "l2vpn_dualLink": "Yes",
+ "l2vpn_description": "VPN Description",
+ "l2vpn_name": "VPN2",
+ "l2vpn_tenantId": "989933",
+ "l2vpn_vpnType": "SOTN",
+ "l2vpn_cbs": "123",
+ "l2vpn_ebs": "23",
+ "l2vpn_colorAware": "true",
+ "l2vpn_reroute": "Yes",
+ "l2vpn_couplingFlag": "true",
+ "l2vpn_cir": "100",
+ "l2vpn_startTime": "28-02-2020",
+ "l2vpn_endTime": "21-02-2020",
+ "l2vpn_eir": "1000",
+ "l2vpn_SLS": "1234"
+ }
+ ],
+ "sotnUni":[
+ {
+ "sotnuni_cVLAN": "Huawei",
+ "sotnuni_tpId": "Huawei-112233"
+ },
+ {
+ "sotnuni_cVLAN": "Huawei-1",
+ "sotnuni_tpId": "Huawei1-554433"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ this.assignData(datas, false);
+ }
+ else {
+ // const httpOptions = {
+ // headers: new HttpHeaders({
+ // 'Content-Type': 'application/json',
+ // })
+ // };
+ // let body = JSON.stringify({}); //this.orderServiceData
+
+ // let url = this.baseUrl + "/uui-lcm/Sotnservices/cost";
+ // return this.http.post<any>(url,body,httpOptions).subscribe((data) => {
+ // this.assignData(data, true);
+ // }, (err) => {
+ // console.log(err);
+ // });
+ }
+ }
+
+ assignData(data,isCost) {
+ this.summaryInfo = data.service;
+ this.mapped = JSON.parse(JSON.stringify(this.summaryInfo));
+ // delete this.mapped.vpninformations;
+ // delete this.mapped.vpnInformations;
+ // if(isCost)
+ // {
+ // delete this.mapped.cost;
+ // this.expandDataSet[0].cost = this.summaryInfo["cost"]["serviceCost"];
+ // this.expandDataSet[1].cost = this.summaryInfo["cost"]["vpnCost"];
+ // }
+ this.myKeys = Object.keys(this.mapped);
+ this.vpnInfo = this.summaryInfo["parameters"]["requestInputs"]["sotnUnderlay"][0].l2vpn[0];
+ this.uniInfo = this.summaryInfo["parameters"]["requestInputs"]["sotnUnderlay"][0].sotnUni;
+ }
+}
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.html b/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.html
new file mode 100644
index 00000000..358f60df
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.html
@@ -0,0 +1,43 @@
+<div class="main">
+ <div class="divCls">
+ <table>
+ <tr>
+ <td>
+ <nz-form-label class= "colm-s-1 lblCls" [nzSm]="6" [nzXs]="24" nzRequired nzFor="capacity">{{"i18nTextDefine_subscriptionType" | translate}}</nz-form-label>
+ </td>
+ <td>
+ <nz-select id="subscriptionType" class= "colm-s-2" [(ngModel)]="selectedSubscriptionType" (ngModelChange)="getServiceInstanceList($event)" nzAllowClear
+ nzPlaceHolder="Choose">
+ <nz-option *ngFor="let option of serviceSubscriptionList" [nzValue]="option.serviceType" [nzLabel]="option.serviceType"></nz-option>
+
+ </nz-select>
+ </td>
+ <td style="width: 5%"></td>
+ <td>
+ <nz-form-label class ="colm-s-1 lblCls" [nzSm]="6" [nzXs]="24" nzRequired nzFor="capacity">{{"i18nTextDefine_serviceInstance" | translate}}</nz-form-label>
+ </td>
+ <td>
+ <nz-select id="serviceInstance" class= "colm-s-2 " [(ngModel)]="selectedServiceInstance" (ngModelChange)="getSelectedsubscriptionInfo($event)"
+ nzAllowClear nzPlaceHolder="Choose">
+ <nz-option *ngFor="let option of serviceInstanceList" [nzValue]="option.serviceInstance" [nzLabel]="option.serviceInstancename"></nz-option>
+ </nz-select>
+ </td>
+ <td style="width: 5%"></td>
+ <td>
+ <nz-form-label class ="colm-s-1 lblCls" [nzSm]="6" [nzXs]="24" nzRequired nzFor="capacity">Topology</nz-form-label>
+ </td>
+ <td>
+ <nz-select id="serviceInstance" class= "colm-s-2 " [(ngModel)]="selectedTopology" (ngModelChange)="getTopologyInfo($event)"
+ nzAllowClear nzPlaceHolder="Choose">
+ <nz-option *ngFor="let option of serviceTopologyList" [nzValue]="option.topologyType" [nzLabel]="option.topologyType"></nz-option>
+ </nz-select>
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="flexDiv">
+ <div id="mynetwork" class="colm-s-3"></div>
+ <div class="colm-s-4"><div id="nodeDetails"></div></div>
+ </div>
+</div> \ No newline at end of file
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.less b/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.less
new file mode 100644
index 00000000..9ebe3741
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.less
@@ -0,0 +1,98 @@
+#mynetwork {
+ width: 100%;
+ height: calc(~"100vh - 300px");
+ border: 1px solid lightgray;
+ margin-right: 40px;
+ background-color: #333333;
+}
+
+
+:host ::ng-deep .ant-form-item-label label {
+ color: var(--on-primary) ;
+ background-color:var(--primary);
+}
+
+:host ::ng-deep .ant-select-dropdown-menu-item{
+ color: var(--on-primary) ;
+ background-color:var(--primary);
+
+}
+:host ::ng-deep .ant-select-selection__rendered {
+ background-color:var(--primary);
+
+}
+:host ::ng-deep .ant-select-selection--single {
+ background-color:var(--primary);
+
+}
+
+:host ::ng-deep .ant-select-selection-selected-value {
+
+ color: var(--on-primary) !important ;
+
+}
+
+@media only screen and (min-width: 600px) {
+.flexDiv {
+ display: flex!important;
+}
+}
+@media only screen and (min-width: 768px) {
+.flexDiv {
+ display: flex!important;
+}
+}
+
+.font-size{
+ font-size: 17px;
+}
+.font-weight{
+ font-weight:bold;
+}
+
+.refreshBtn{
+ right: 580px;
+ position: absolute;
+ top: 35px;
+ z-index: 1
+}
+
+:host ::ng-deep .ant-form-item-label label {
+ color: var(--on-primary) ;
+}
+
+:host ::ng-deep .ant-select-selection__placeholder
+{
+ color: var(--on-primary);
+}
+
+:host ::ng-deep .ant-select-arrow {
+
+
+ color: var(--on-primary);
+ font-size: 12px;
+}
+
+
+.popup-table-row
+{
+ color: aqua;
+}
+
+.divCls{
+ display: inline-block;
+ width: 100%;
+ padding-bottom: 10px;
+ color : var(--on-lables) ;
+ }
+
+ .main {
+ padding-left:80px
+ }
+ .ant-col-sm-6 {
+ width:100%;
+ }
+
+ #subscriptionType, #serviceInstance {
+ width: 250px;
+ } \ No newline at end of file
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.spec.ts b/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.spec.ts
new file mode 100644
index 00000000..21012f6d
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { MonitorServiceComponent } from './monitor-service.component';
+
+describe('MonitorServiceComponent', () => {
+ let component: MonitorServiceComponent;
+ let fixture: ComponentFixture<MonitorServiceComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ MonitorServiceComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(MonitorServiceComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.ts b/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.ts
new file mode 100644
index 00000000..5e003ff3
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/monitor-service/monitor-service.component.ts
@@ -0,0 +1,330 @@
+import { Component, OnInit } from '@angular/core';
+import { Network, DataSet, Node, Edge, IdType } from 'vis';
+
+@Component({
+ selector: 'app-monitor-service',
+ templateUrl: './monitor-service.component.html',
+ styleUrls: ['./monitor-service.component.less']
+})
+export class MonitorServiceComponent implements OnInit {
+
+ selectedSubscriptionType:string = "SOTN";
+ serviceSubscriptionList:any = [{
+ serviceType:"SOTN"
+ }];
+ selectedServiceInstance:string = "SiteService-5011";
+ serviceInstanceList:any = [
+ {
+ serviceInstance: "SiteService-5011",
+ serviceInstancename: "SiteService-5011"
+ },
+ {
+ serviceInstance: "ISAAC-IS0333",
+ serviceInstancename: "ISAAC-IS0333"
+ }
+ ];
+ selectedTopology:string = 'Network Topology';
+ serviceTopologyList:any = [
+ {
+ topologyType:"Network Topology"
+ },
+ {
+ topologyType:"Resource Topology"
+ }
+ ];
+
+ title = 'Network';
+ public nodes: Node;
+ public edges: Edge;
+ public network: Network;
+ public serviceList: any;
+ public tempNode: any;
+ public tempEdge: any;
+ public selectedNode: any;
+ public selectedNodeIds: any;
+ public x: any;
+ public abc = [];
+ container: any;
+ networkOptions = {
+ layout: {
+ randomSeed: 15
+ },
+ nodes: {
+ borderWidth: 13,
+ size: 30,
+ color: {
+ border: '#54bd55',
+ background: '#666666'
+ },
+ font: { color: '#eeeeee' }
+ },
+ edges: {
+ color: 'lightgray'
+ },
+
+ interaction: {
+ tooltipDelay: 200,
+ hideEdgesOnDrag: true,
+ navigationButtons: false,
+ keyboard: true,
+ hover: true
+ },
+ };
+
+ node1:any = {
+ "nodes": [
+ {
+ "id": "1",
+ "shape": "circularImage",
+ "image": "./assets/images/edge.png",
+ "label": "Node",
+ "color": "Green",
+ "dataNode": {
+ "ethtSvcName": "sotn-021-VS-monitored",
+ "colorAware": "true",
+ "cbs": "100",
+ "couplingFlag": "true",
+ "ebs": "evpl",
+ "cir": "200000",
+ "eir": "0"
+ }
+ },
+ {
+ "id": "2",
+ "shape": "circularImage",
+ "image": "./assets/images/logicallink.png",
+ "label": "Logical Link",
+ "color": "Green",
+ "dataNode": {
+ "ethtSvcName": "sotn-021-VS-monitored",
+ "colorAware": "true",
+ "cbs": "100",
+ "couplingFlag": "true",
+ "ebs": "evpl",
+ "cir": "200000",
+ "eir": "0"
+ }
+ },
+ {
+ "id": "3",
+ "shape": "circularImage",
+ "image": "./assets/images/edge.png",
+ "label": "Node",
+ "color": "Green",
+ "dataNode": {
+ "zipcode": "100095",
+ "siteName": "hubtravel",
+ "description": "desc",
+ "location": "laptop-5",
+ "cvlan": "100"
+ }
+ }
+ ],
+ "edges": [
+ {
+ "from": "1",
+ "to": "2"
+ },
+ {
+ "from": "2",
+ "to": "3"
+ }
+ ]
+ }
+
+ node2:any = {
+ "nodes": [
+ {
+ "id": "1",
+ "shape": "circularImage",
+ "image": "./assets/images/tpoint.png",
+ "label": "Termination Point",
+ "color": "Green",
+ "dataNode": {}
+ },
+ {
+ "id": "2",
+ "shape": "circularImage",
+ "image": "./assets/images/edge.png",
+ "label": "Node",
+ "color": "Green",
+ "dataNode": {
+ "ethtSvcName": "sotn-021-VS-monitored",
+ "colorAware": "true",
+ "cbs": "100",
+ "couplingFlag": "true",
+ "ebs": "evpl",
+ "cir": "200000",
+ "eir": "0"
+ }
+ },
+ {
+ "id": "3",
+ "shape": "circularImage",
+ "image": "./assets/images/logicallink.png",
+ "label": "Logical Link",
+ "color": "Green",
+ "dataNode": {
+ "ethtSvcName": "sotn-021-VS-monitored",
+ "colorAware": "true",
+ "cbs": "100",
+ "couplingFlag": "true",
+ "ebs": "evpl",
+ "cir": "200000",
+ "eir": "0"
+ }
+ },
+ {
+ "id": "4",
+ "shape": "circularImage",
+ "image": "./assets/images/edge.png",
+ "label": "Node",
+ "color": "Green",
+ "dataNode": {
+ "zipcode": "100095",
+ "siteName": "hubtravel",
+ "description": "desc",
+ "location": "laptop-5",
+ "cvlan": "100"
+ }
+ },
+ {
+ "id": "5",
+ "shape": "circularImage",
+ "image": "./assets/images/tpoint.png",
+ "label": "Termination Point",
+ "color": "Green",
+ "dataNode": {
+ "accessltpid": "155",
+ "siteName": "hubtravel",
+ "description": "desc",
+ "accessnodeid": "10.10.10.10",
+ "cvlan": "100"
+ }
+ }
+ ],
+ "edges": [
+ {
+ "from": "1",
+ "to": "2"
+ },
+ {
+ "from": "2",
+ "to": "3"
+ },
+ {
+ "from": "3",
+ "to": "4"
+ },
+ {
+ "from": "4",
+ "to": "5"
+ }
+ ]
+ }
+
+ constructor() { }
+
+ intervalData: any;
+ returnResponse: boolean = true;
+
+ //Get SubscriptionType
+ getSubscribeTypes() {
+ this.getTopologyInfo('Network Topology');
+ }
+
+ getTopologyInfo (topo) {
+ this.selectedTopology = topo;
+ this.getData();
+ this.refreshData();
+ }
+
+ //Get subscription instanceID by calling With Subscription Type
+ getServiceInstanceList(subscriptionType) {
+ this.getSelectedsubscriptionInfo(subscriptionType);
+ }
+ ngOnInit() {
+ this.container = document.getElementById('mynetwork');
+ this.getSubscribeTypes();
+ }
+
+ refreshData() {
+
+ var data1 = {
+ nodes: this.serviceList.nodes,
+ edges: this.serviceList.edges
+ };
+
+ var network = new Network(this.container, data1, this.networkOptions);
+
+
+ network.on('select', function (selection) {
+ this.selectedNodeIds = selection.nodes[0]; // array of selected node's ids
+ var filteredNode = data1.nodes.filter(item => (
+ item.id == this.selectedNodeIds
+ ));
+ var t1 = '<div class="tblDiv">\
+ <nz-form-label class="lblCls">Node Information</nz-form-label>\
+ <table class="table table-striped table-bordered">\
+ <thead>\
+ <tr>\
+ <th class="clr-primary padding-2p">Specification</th>\
+ <th class="clr-primary padding-2p">Value</th>\
+ </tr>\
+ </thead>\
+ <tbody>\
+ ';
+ Object.entries(filteredNode[0].dataNode).forEach(entry => {
+ if( entry[1] !== "null")
+ {
+ t1 += '<tr class="popup-table-row">\
+ <td class="popup-table-header clr-primary padding-2p">'+ entry[0] + ':</td>\
+ <td class="popup-table-data clr-primary padding-2p">'+ entry[1] + '</td>\
+ </tr>\
+ ';
+ }
+ });
+ t1 += '</tbody>\
+ </table>\
+ </div>\
+ ';
+ document.getElementById('nodeDetails').innerHTML = t1;
+ });
+ network.on("afterDrawing", function (this) {
+ network.fit();
+ });
+ }
+
+ getData ()
+ {
+ if (this.selectedTopology == 'Network Topology') {
+ this.serviceList = this.node1;
+ } else {
+ this.serviceList = this.node2;
+ }
+ }
+ // Getting sitedata Based On Type and ID
+ getSelectedsubscriptionInfo(s) {
+ this.getData();
+ this.refreshData();
+ if (this.intervalData) {
+ clearInterval(this.intervalData);
+ }
+ }
+
+ ngOnDestroy() {
+ console.log('clear interval');
+ if (this.intervalData) {
+ clearInterval(this.intervalData);
+ }
+
+ }
+
+ ngOnDelete() {
+ console.log('clear interval');
+ if (this.intervalData) {
+ clearInterval(this.intervalData);
+ }
+ }
+
+}
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.html b/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.html
new file mode 100644
index 00000000..4adf3747
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.html
@@ -0,0 +1,204 @@
+<div theme class="main">
+ <nz-table #nzExpandTable [nzData]="expandDataSet" [nzShowPagination]=false>
+ <tbody>
+ <tr>
+ <td width="4%"></td>
+ <td width="96%">
+ <button style="float:right" (click)="selectOrderSiteData()" nz-button nzType="primary">Create Service</button>
+ </td>
+ </tr>
+ <ng-template ngFor let-data [ngForOf]="nzExpandTable.data">
+ <tr>
+ <td width="4%" class="tdCls" nzShowExpand [(nzExpand)]="data.expand"></td>
+ <td width="96%" class="tdCls">{{data.name | translate}}</td>
+ </tr>
+ <tr [nzExpand]="data.expand">
+ <td class="noPadding" colspan="2">
+ <form autocomplete="off" [formGroup]="validateForm">
+ <ng-template [ngIf]="data.rowIdx == 1">
+ <div style="display: flex; justify-content: center; padding: 1%;">
+ <div style="width: 100%" class="">
+ <div style="display: flex; justify-content: space-around;">
+ <div class="sotn-form">
+ <nz-form-item class="mar-0x">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="name" ><span class="form-lable-font"> {{ "i18nTextDefine_Name" | translate}}</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="name" id="name" [(ngModel)]="siteData.name">
+ </nz-form-control>
+ </nz-form-item>
+ </div>
+ <div class="sotn-form ">
+ <nz-form-item class="mar-0x">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="description"><span class="form-lable-font">{{ "i18nTextDefine_Description" | translate}}</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="description" id="description" [(ngModel)]="siteData.description">
+ </nz-form-control>
+ </nz-form-item>
+ </div>
+ </div>
+ </div>
+ </div>
+ </ng-template>
+ <ng-template [ngIf]="data.rowIdx == 2">
+ <div style="display: flex; justify-content: center; padding: 1%;">
+ <div style="width: 100%" class="">
+ <div style="display: flex; justify-content: space-around;">
+ <div class="sotn-form">
+ <nz-form-item class="mar-0x">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_name" ><span class="form-lable-font"> {{ "i18nTextDefine_Name" | translate}}</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_name" id="l2vpn_name" [(ngModel)]="l2vpn.l2vpn_name">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_description"><span class="form-lable-font">{{ "i18nTextDefine_Description" | translate}}</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_description" id="l2vpn_description" [(ngModel)]="l2vpn.l2vpn_description">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_COS"><span class="form-lable-font">COS</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_COS" id="l2vpn_COS" [(ngModel)]="l2vpn.l2vpn_COS" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_dualLink"><span class="form-lable-font">Dual Link</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_dualLink" id="l2vpn_dualLink" [(ngModel)]="l2vpn.l2vpn_dualLink" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_tenantId"><span class="form-lable-font">Tenant ID</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_tenantId" id="l2vpn_tenantId" [(ngModel)]="l2vpn.l2vpn_tenantId" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_vpnType"><span class="form-lable-font">VPN Type</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_vpnType" id="l2vpn_vpnType" [(ngModel)]="l2vpn.l2vpn_vpnType" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_cbs"><span class="form-lable-font">CBS</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_cbs" id="l2vpn_cbs" [(ngModel)]="l2vpn.l2vpn_cbs" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_ebs"><span class="form-lable-font">EBS</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_ebs" id="l2vpn_ebs" [(ngModel)]="l2vpn.l2vpn_ebs" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ </div>
+ <div class="sotn-form ">
+ <nz-form-item class="mar-0x">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_colorAware" ><span class="form-lable-font">Color Aware</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_colorAware" id="l2vpn_colorAware" [(ngModel)]="l2vpn.l2vpn_colorAware">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_reroute"><span class="form-lable-font">Re-route</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_reroute" id="l2vpn_reroute" [(ngModel)]="l2vpn.l2vpn_reroute">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_couplingFlag"><span class="form-lable-font">Coupling Flag</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_couplingFlag" id="l2vpn_couplingFlag" [(ngModel)]="l2vpn.l2vpn_couplingFlag" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_cir"><span class="form-lable-font">CIR</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_cir" id="l2vpn_cir" [(ngModel)]="l2vpn.l2vpn_cir" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_startTime"><span class="form-lable-font">Strat Time</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <nz-date-picker formControlName="l2vpn_startTime" id="l2vpn_startTime" [(ngModel)]="l2vpn.l2vpn_startTime"></nz-date-picker>
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_endTime"><span class="form-lable-font">End Time</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <nz-date-picker formControlName="l2vpn_endTime" id="l2vpn_endTime" [(ngModel)]="l2vpn.l2vpn_endTime"></nz-date-picker>
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_eir"><span class="form-lable-font">EIR</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_eir" id="l2vpn_eir" [(ngModel)]="l2vpn.l2vpn_eir" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ <nz-form-item class="mar-0x child">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="l2vpn_SLS"><span class="form-lable-font">SLS</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="l2vpn_SLS" id="l2vpn_SLS" [(ngModel)]="l2vpn.l2vpn_SLS" (keypress)="numberOnly($event)">
+ </nz-form-control>
+ </nz-form-item>
+ </div>
+ </div>
+ </div>
+ </div>
+ </ng-template>
+ <ng-template [ngIf]="data.rowIdx == 3">
+ <div style="display: flex; justify-content: center; padding: 1%;">
+ <div style="width: 100%" class="">
+ <div style="display: flex; justify-content: space-around;">
+ <div class="sotn-form">
+ <nz-form-item class="mar-0x">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="sotnuni_cVLAN" ><span class="form-lable-font">VLAN</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="sotnuni_cVLAN" id="sotnuni_cVLAN" [(ngModel)]="uni.sotnuni_cVLAN">
+ </nz-form-control>
+ </nz-form-item>
+ </div>
+ <div class="sotn-form ">
+ <nz-form-item class="mar-0x">
+ <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="sotnuni_tpId" ><span class="form-lable-font">TP ID</span></nz-form-label>
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <input nz-input formControlName="sotnuni_tpId" id="sotnuni_tpId" [(ngModel)]="uni.sotnuni_tpId">
+ </nz-form-control>
+ </nz-form-item>
+ </div>
+ <div class="sotn-form ">
+ <nz-form-item class="mar-0x">
+ <nz-form-control [nzSm]="14" [nzXs]="24">
+ <button (click)="addUNI($event)" nz-button nzType="primary">Add</button>
+ </nz-form-control>
+ </nz-form-item>
+ </div>
+ </div>
+ <nz-table #basicTable [nzData]="sotnUni" [nzShowPagination]="false">
+ <thead>
+ <tr>
+ <th>VLAN</th>
+ <th>TP Id</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr *ngFor="let data of basicTable.data">
+ <td>{{ data.sotnuni_cVLAN }}</td>
+ <td>{{ data.sotnuni_tpId }}</td>
+ <td>
+ <a>Delete</a>
+ </td>
+ </tr>
+ </tbody>
+ </nz-table>
+ </div>
+ </div>
+ </ng-template>
+ </form>
+ </td>
+ </tr>
+ </ng-template>
+ </tbody>
+ </nz-table>
+</div> \ No newline at end of file
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.less b/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.less
new file mode 100644
index 00000000..5ac5c07d
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.less
@@ -0,0 +1,59 @@
+
+.main {
+ min-height: calc(~"100vh - 165px");
+}
+nz-table
+{
+ th,tr,td,nz-spin,div,span
+ {
+ background: var(--primary);
+ color: var(--on-primary) ;
+ .action
+ {
+ margin-left:10px;
+ }
+ }
+ td{
+ border-bottom: 1px solid #F7F8FC;
+ padding:5px;
+ }
+ th{
+ padding:5px;
+ font-weight:bold;
+ color: var(--on-primary) ;
+ }
+ tr{
+ border-left-color: var(--primary);
+ }
+
+
+}
+.tdCls{
+ font-weight:bold;
+ color: var(--on-primary) ;
+ background-color:var(--primary) ;
+ overflow: hidden;
+ height:21px;
+ }
+.sotn-form{
+ display: flex;
+ flex-direction: column;
+ width: 45%;
+}
+.crt-btn{
+
+ display: flex;
+ justify-content: flex-end;
+}
+.form-lable-font{
+ font-weight: bold;
+ color: deepskyblue;
+}
+.mar-0x{
+ margin:0;
+}
+
+.labelcls{
+ color: var(--on-primary);
+}
+
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.spec.ts b/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.spec.ts
new file mode 100644
index 00000000..d135a250
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { OrderServiceComponent } from './order-service.component';
+
+describe('OrderServiceComponent', () => {
+ let component: OrderServiceComponent;
+ let fixture: ComponentFixture<OrderServiceComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ OrderServiceComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(OrderServiceComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.ts b/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.ts
new file mode 100644
index 00000000..5a6bf6a2
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/order-service/order-service.component.ts
@@ -0,0 +1,197 @@
+import { Component, OnInit } from '@angular/core';
+import {
+ FormBuilder,
+ FormGroup,
+ Validators
+} from '@angular/forms';
+import { HttpClient, HttpHeaders } from '@angular/common/http';
+import { NzMessageService } from 'ng-zorro-antd';
+
+@Component({
+ selector: 'app-order-service',
+ templateUrl: './order-service.component.html',
+ styleUrls: ['./order-service.component.less']
+})
+export class OrderServiceComponent implements OnInit {
+
+ validateForm: FormGroup;
+ validateForm1: FormGroup;
+ validateForm2: FormGroup;
+ l2vpn:object = {};
+ siteData:object = {};
+ tipMsg: String = "serviceCreationInitiated";
+ displayMsg:boolean = false;
+ displayMsg2:boolean = false;
+ buttonDisabled:boolean = false;
+ intervalData:any;
+ baseUrl:string = '/api/usecaseui-server/v1';
+ expandDataSet = [
+ { rowIdx: 1, name: 'Service', expand: true },
+ { rowIdx: 2, name: 'VPN', expand: true },
+ { rowIdx: 3, name: 'UNI', expand: true }
+ ];
+ uni = {
+ sotnuni_cVLAN:"asdf",
+ sotnuni_tpId:"asdf"
+ };
+ sotnUni = [
+ {
+ sotnuni_cVLAN:"asdf",
+ sotnuni_tpId:"saf"
+ }
+ ];
+
+ constructor(private fb: FormBuilder, private http: HttpClient, private message: NzMessageService) { }
+
+ ngOnInit() {
+ this.validateForm = this.fb.group({
+ name:[null, [Validators.required]],
+ description:[null, [Validators.required]],
+ l2vpn_name:[null, [Validators.required]],
+ l2vpn_dualLink:[null, [Validators.required]],
+ l2vpn_description:[null, [Validators.required]],
+ l2vpn_SLS:[null, [Validators.required]],
+ l2vpn_COS:[null, [Validators.required]],
+ l2vpn_tenantId:[null, [Validators.required]],
+ l2vpn_vpnType:[null, [Validators.required]],
+ l2vpn_cbs:[null, [Validators.required]],
+ l2vpn_ebs:[null, [Validators.required]],
+ l2vpn_colorAware:[null, [Validators.required]],
+ l2vpn_reroute:[null, [Validators.required]],
+ l2vpn_couplingFlag:[null, [Validators.required]],
+ l2vpn_cir:[null, [Validators.required]],
+ l2vpn_eir:[null, [Validators.required]],
+ l2vpn_startTime:[null, [Validators.required]],
+ l2vpn_endTime:[null, [Validators.required]],
+ sotnuni_cVLAN:[null, [Validators.required]],
+ sotnuni_tpId:[null, [Validators.required]],
+ });
+ // this.validateForm1 = this.fb.group({
+ // l2vpn_name:[null, [Validators.required]],
+ // l2vpn_dualLink:[null, [Validators.required]],
+ // l2vpn_description:[null, [Validators.required]],
+ // l2vpn_SLS:[null, [Validators.required]],
+ // l2vpn_COS:[null, [Validators.required]],
+ // l2vpn_tenantId:[null, [Validators.required]],
+ // l2vpn_vpnType:[null, [Validators.required]],
+ // l2vpn_cbs:[null, [Validators.required]],
+ // l2vpn_ebs:[null, [Validators.required]],
+ // l2vpn_colorAware:[null, [Validators.required]],
+ // l2vpn_reroute:[null, [Validators.required]],
+ // l2vpn_couplingFlag:[null, [Validators.required]],
+ // l2vpn_cir:[null, [Validators.required]],
+ // l2vpn_eir:[null, [Validators.required]],
+ // l2vpn_startTime:[null, [Validators.required]],
+ // l2vpn_endTime:[null, [Validators.required]],
+ // });
+ // this.validateForm2 = this.fb.group({
+ // sotnuni_cVLAN:[null, [Validators.required]],
+ // sotnuni_tpId:[null, [Validators.required]],
+ // });
+ }
+
+ numberOnly(event): boolean {
+ const charCode = (event.which) ? event.which : event.keyCode;
+ if (charCode > 31 && (charCode < 48 || charCode > 57)) {
+ }
+ return true;
+ }
+
+ addUNI () {
+ this.sotnUni.push(this.uni);
+ // this.uni = {};
+ }
+
+ selectOrderSiteData(): void {
+ if (!this.validateVpnAndUni() ||
+ !this.validateServices() ) {
+ this.displayMsg = true;
+ this.message.error("Please fill all mandatory fields");
+ var comp = this;
+ setTimeout(function () {
+ comp.displayMsg = false;
+ }, 5000);
+ } else {
+ this.putnewSotnSiteData()
+ }
+ }
+
+ validateServices (): boolean {
+ if (this.siteData["name"] == null ||
+ this.siteData["description"] == null) {
+ return false;
+ }
+ return true;
+ }
+
+ validateVpnAndUni (): boolean {
+ if (this.l2vpn["l2vpn_COS"] == null ||
+ this.l2vpn["l2vpn_dualLink"] == null ||
+ this.l2vpn["l2vpn_description"] == null ||
+ this.l2vpn["l2vpn_name"] == null ||
+ this.l2vpn["l2vpn_tenantId"] == null ||
+ this.l2vpn["l2vpn_vpnType"] == null ||
+ this.l2vpn["l2vpn_cbs"] == null ||
+ this.l2vpn["l2vpn_ebs"] == null ||
+ this.l2vpn["l2vpn_colorAware"] == null ||
+ this.l2vpn["l2vpn_cir"] == null ||
+ this.l2vpn["l2vpn_startTime"] == null ||
+ this.l2vpn["l2vpn_endTime"] == null ||
+ this.l2vpn["l2vpn_eir"] == null ||
+ this.l2vpn["l2vpn_SLS"] == null ||
+ this.sotnUni.length == 0 ||
+ this.l2vpn["l2vpn_reroute"] == null) {
+ return false;
+ }
+ return true;
+ }
+
+ putnewSotnSiteData() {
+ console.log("order service data===>", this.siteData)
+ let comp = this;
+ this.message.info('Instantiation In Progress');
+ this.buttonDisabled = true;
+ let body = JSON.stringify(this.siteData);
+ const httpOptions = {
+ headers: new HttpHeaders({
+ 'Content-Type': 'application/json',
+ })
+ };
+ let url1 = this.baseUrl + '/uui-lcm/Sotnservices';
+ // this.http.post<any>(url1, body, httpOptions).subscribe((data) => {
+ // let comp = this;
+ // this.message.info('Instantiation In Progress');
+ // comp.displayMsg2 = true;
+ // this.intervalData = setInterval(() => {
+ // let url2 = this.baseUrl + "/uui-lcm/Sotnservices/serviceStatus/service-instance/" + data.service.serviceId;
+ // this.http.get<any>(url2, {}).subscribe((data) => {
+ // if (data.status == "1") {
+ // clearInterval(comp.intervalData);
+ // comp.displayMsg2 = true;
+ // comp.message.success('Service Created');
+ // comp.goToPage();
+ // }
+ // else {
+ // comp.message.info('Instantiation In Progress');
+ // comp.displayMsg2 = true;
+ // }
+ // }, (err) => {
+ // console.log(err);
+ // });
+ // }, 1000);
+ // }, (err) => {
+ // console.log(err);
+ // });
+ setTimeout(() => {
+ comp.message.success("Service Created");
+ comp.goToPage();
+ }, 3000);
+ }
+
+ goToPage(): void {
+ setTimeout(function () {
+ // document.getElementById('manageService').click();
+ }, 1000);
+ }
+
+}
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.html b/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.html
new file mode 100644
index 00000000..12fcb851
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.html
@@ -0,0 +1,17 @@
+<nz-tabset (nzSelectChange)="handleTabChange($event)" class="slicing">
+ <nz-tab nzTitle="Order Service">
+ <app-order-service
+ *ngIf="currentTab ==='Order Service'"
+ ></app-order-service>
+ </nz-tab>
+ <nz-tab nzTitle="Manage Service" >
+ <app-manage-service
+ *ngIf="currentTab ==='Manage Service'"
+ ></app-manage-service>
+ </nz-tab>
+ <nz-tab nzTitle="Monitor Service">
+ <app-monitor-service
+ *ngIf="currentTab ==='Monitor Service'"
+ ></app-monitor-service>
+ </nz-tab>
+</nz-tabset> \ No newline at end of file
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.less b/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.less
new file mode 100644
index 00000000..dae93f22
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.less
@@ -0,0 +1,3 @@
+.slicing-content{
+ padding: 20px;
+ } \ No newline at end of file
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.spec.ts b/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.spec.ts
new file mode 100644
index 00000000..071a6789
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SotnManagementComponent } from './sotn-management.component';
+
+describe('SotnManagementComponent', () => {
+ let component: SotnManagementComponent;
+ let fixture: ComponentFixture<SotnManagementComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ SotnManagementComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(SotnManagementComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.ts b/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.ts
new file mode 100644
index 00000000..84886f31
--- /dev/null
+++ b/usecaseui-portal/src/app/views/services/sotn-management/sotn-management.component.ts
@@ -0,0 +1,25 @@
+import { Component, OnInit, HostBinding } from '@angular/core';
+import { slideToRight } from '../../../shared/utils/animates';
+
+@Component({
+ selector: 'app-sotn-management',
+ templateUrl: './sotn-management.component.html',
+ styleUrls: ['./sotn-management.component.less'],
+ animations: [slideToRight]
+})
+export class SotnManagementComponent implements OnInit {
+
+ @HostBinding('@routerAnimate') routerAnimateState;
+
+ currentTab = 'Order Service';
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+ handleTabChange($event): void {
+ console.log($event,"$event");
+ this.currentTab = $event.tab._title;
+ }
+}
diff --git a/usecaseui-portal/src/assets/i18n/cn.json b/usecaseui-portal/src/assets/i18n/cn.json
index 5a49d3d2..244f055a 100644
--- a/usecaseui-portal/src/assets/i18n/cn.json
+++ b/usecaseui-portal/src/assets/i18n/cn.json
@@ -6,6 +6,7 @@
"i18nTextDefine_Monitor_5g": "5G 切片",
"i18nTextDefine_Services": "服务",
"i18nTextDefine_ServicesList": "服务列表",
+ "i18nTextDefine_SotnEline": "SOTN Eline",
"i18nTextDefine_Mangement_5g": "5G切片管理",
"i18nTextDefine_PackageManagement": "包管理",
"i18nTextDefine_Alarm": "告警",
@@ -138,5 +139,16 @@
"i18nTextDefine_RightPort": "右侧端口",
"i18nTextDefine_PartnerNetwork": "伙伴网络",
"i18nTextDefine_HostUrl": "主机网址",
- "i18nTextDefine_deleteLink": "删除链接"
+ "i18nTextDefine_deleteLink": "删除链接",
+
+ "sotn-component": "--:",
+ "i18nTextDefine_subscriptionType": "Service Type",
+ "i18nTextDefine_serviceInstance": "Service Instance",
+ "i18nTextDefine_serviceInformation": "Service Information",
+ "i18nTextDefine_vpnInformation": "VPN Information",
+ "i18nTextDefine_vpnName": "VPN Name",
+ "i18nTextDefine_siteInformation": "Site Information",
+ "i18nTextDefine_siteName": "Site Name",
+ "i18nTextDefine_city": "City",
+ "i18nTextDefine_postalCode": "Postal Code"
}
diff --git a/usecaseui-portal/src/assets/i18n/en.json b/usecaseui-portal/src/assets/i18n/en.json
index b25413e4..94fc3df7 100644
--- a/usecaseui-portal/src/assets/i18n/en.json
+++ b/usecaseui-portal/src/assets/i18n/en.json
@@ -6,6 +6,7 @@
"i18nTextDefine_Monitor_5g": "5G Slicing",
"i18nTextDefine_Services": "Services",
"i18nTextDefine_ServicesList": "Lifecycle Management",
+ "i18nTextDefine_SotnEline": "SOTN Eline",
"i18nTextDefine_Mangement_5g": "5G Slicing Management",
"i18nTextDefine_PackageManagement": "Package Management",
"i18nTextDefine_Alarm": "Alarm",
@@ -137,5 +138,16 @@
"i18nTextDefine_RightPort": "Right Port",
"i18nTextDefine_PartnerNetwork": "Partner Network",
"i18nTextDefine_HostUrl": "Host Url",
- "i18nTextDefine_DeleteLink": "Delete Link"
+ "i18nTextDefine_DeleteLink": "Delete Link",
+
+ "sotn-component": "--:",
+ "i18nTextDefine_subscriptionType": "Service Type",
+ "i18nTextDefine_serviceInstance": "Service Instance",
+ "i18nTextDefine_serviceInformation": "Service Information",
+ "i18nTextDefine_vpnInformation": "VPN Information",
+ "i18nTextDefine_vpnName": "VPN Name",
+ "i18nTextDefine_siteInformation": "Site Information",
+ "i18nTextDefine_siteName": "Site Name",
+ "i18nTextDefine_city": "City",
+ "i18nTextDefine_postalCode": "Postal Code"
}
diff --git a/usecaseui-portal/src/assets/images/edge.png b/usecaseui-portal/src/assets/images/edge.png
new file mode 100644
index 00000000..95ee21bd
--- /dev/null
+++ b/usecaseui-portal/src/assets/images/edge.png
Binary files differ
diff --git a/usecaseui-portal/src/assets/images/logicallink.png b/usecaseui-portal/src/assets/images/logicallink.png
new file mode 100644
index 00000000..bfeccb43
--- /dev/null
+++ b/usecaseui-portal/src/assets/images/logicallink.png
Binary files differ
diff --git a/usecaseui-portal/src/assets/images/tpoint.png b/usecaseui-portal/src/assets/images/tpoint.png
new file mode 100644
index 00000000..18e4e4cb
--- /dev/null
+++ b/usecaseui-portal/src/assets/images/tpoint.png
Binary files differ