fix: fix the bug of subnet-params and conflict 42/111942/3
authorwangyuerg <wangyuerg@chinamobile.com>
Tue, 1 Sep 2020 09:11:20 +0000 (17:11 +0800)
committerwangyuerg <wangyuerg@chinamobile.com>
Tue, 1 Sep 2020 09:26:40 +0000 (17:26 +0800)
Change-Id: Ic27e6cfbb3a706ed23f3f1317dd552c01f285bb1
Signed-off-by: wangyuerg <wangyuerg@chinamobile.com>
Issue-ID: USECASEUI-444

usecaseui-portal/src/app/views/services/slicing-management/slicing-task-management/slicing-task-model/slicing-task-model.component.html
usecaseui-portal/src/app/views/services/slicing-management/slicing-task-management/slicing-task-model/slicing-task-model.component.ts
usecaseui-portal/src/app/views/services/slicing-management/slicing-task-management/slicing-task-model/subnet-params-model/subnet-params-model.component.html
usecaseui-portal/src/app/views/services/slicing-management/slicing-task-management/slicing-task-model/subnet-params-model/subnet-params-model.component.less
usecaseui-portal/src/app/views/services/slicing-management/slicing-task-management/slicing-task-model/subnet-params-model/subnet-params-model.component.ts
usecaseui-portal/src/constants/constants.ts

index 6bc7202..58f08d4 100644 (file)
@@ -74,7 +74,7 @@
   <button nz-button (click)="handleCancel()">Cancel</button>
   <button nz-button nzType="primary" [nzLoading]='loading' (click)="handleOk()">OK</button>
 </ng-template>
-<app-subnet-params-model [showModel]="isShowParams" [detailData]="params" [title]="paramsTitle"
+<app-subnet-params-model [showModel]="isShowParams" *ngIf="isShowParams" [detailData]="params" [title]="paramsTitle"
   (cancel)="isShowParams=$event" (paramsDataChange)="changeParams($event)">
 </app-subnet-params-model>
 <app-notification #notification [isServicesList]="false" [parentComponent]="'slicing'"></app-notification>
\ No newline at end of file
index f65ed32..2ebbb32 100644 (file)
@@ -157,7 +157,7 @@ export class SlicingTaskModelComponent implements OnInit {
                 'an_area_traffic_cap_ul',
                 'an_script_name',
                 'an_overalluser_density',
-                'an_Endpoint'
+                 'an_Endpoint'
             ]), an_coverage_area_ta_list: area};
         this.slicingSubnet[1].params = this.pick(nsi_nssi_info, ['tn_latency', 'tn_bandwidth', 'tn_script_name', 'tn_jitter', 'tn_service_snssai']);
         this.slicingSubnet[2].params = {...this.pick(nsi_nssi_info, [
index 50b6e5a..6a49cc6 100644 (file)
@@ -8,7 +8,7 @@
                                </nz-form-label>
                                <nz-form-control [nzSpan]="12">
                                        <input nz-input
-                                                  [(ngModel)]="detailData[item.key]"
+                                                  [(ngModel)]="formData[item.key]"
                                                   [name]="item.key"
                                                   [id]="item.key"
                                                   [readOnly]="item.title === 'S-NSSAI'"
                                        {{ item.title }}
                                </nz-form-label>
                                <nz-form-control [nzSpan]="item.title === 'Endpoint'?14:8" *ngIf="item.key !== 'an_coverage_area_ta_list'">
-                                       <input nz-input [id]="item.key" [name]="item.key" [(ngModel)]="detailData[item.key]"
+                                       <input nz-input [id]="item.key" [name]="item.key" [(ngModel)]="formData[item.key]"
                                                [readOnly]="item.title === 'S-NSSAI'" [disabled]="item.title === 'S-NSSAI'"
                                                *ngIf=" item.title !== 'Resource Sharing Level' && item.title !== 'Mobility' && item.title !== 'Endpoint' " />
-                                       <nz-radio-group [name]="item.key" [(ngModel)]="detailData[item.key]"
+                                       <nz-radio-group [name]="item.key" [(ngModel)]="formData[item.key]"
                                                *ngIf="item.title === 'Resource Sharing Level'">
                                                <label nz-radio [nzValue]="option.key" *ngFor="let option of item.options">
                                                        {{ option.title }}
                                                </label>
                                        </nz-radio-group>
-                                       <nz-select [name]="item.key" [(ngModel)]="detailData[item.key]" *ngIf="item.title === 'Mobility'">
+                                       <nz-select [name]="item.key" [(ngModel)]="formData[item.key]" *ngIf="item.title === 'Mobility'">
                                                <nz-option [nzValue]="option.key" [nzLabel]="option.title" *ngFor="let option of item.options">
                                                </nz-option>
                                        </nz-select>
+                                       <div class="validation_alert">{{formData[item.key] === ''? 'can not be empty!':' '}}</div>
                                        <!-- 2020.08.17  Add 3 parameters for Endpoint-->
                                        <!-- Comment: The following code-->
                                        <nz-input-group *ngIf="item.title === 'Endpoint' && EndpointEnable">
                                                <div *ngFor="let option of item.options;let i=index">
-                                                       <input nz-input
+                                                       <div class="endpoint_input">
+                                                               <input nz-input
                                                                   *ngIf="option.title !== 'nexthop_info'"
                                                                   [id]="option.key"
                                                                   [name]="option.key"
                                                                   [title]="EndpointInputs[i][option.key]"
                                                                   [(ngModel)]="EndpointInputs[i][option.key]"
+                                                                  [placeholder]="option.holder"
+                                                                  (input)="onInput($event, option.title)"
                                                                   style="width:32%;margin-right:1%" />
+                                                               <div class="end_alert_ip" *ngIf="option.title === 'ip_address'">{{validateEndPoint(option.title, EndpointInputs[i][option.key])}}</div>
+                                                               <div class="end_alert_logical"  *ngIf="option.title === 'logical_link'">{{validateEndPoint(option.title, EndpointInputs[i][option.key])}}</div>
+                                                       </div>
                                                        <nz-select
                                                                        *ngIf="option.title === 'nexthop_info'"
                                                                        [name]="option.key"
@@ -84,6 +91,7 @@
                                                        </button>
                                                </nz-form-control>
                                        </div>
+                                       <div class="validation_alert_area">{{checkArea()}}</div>
                                </div>
                        </nz-form-item>
                </form>
index 814d2f0..2509339 100644 (file)
 }\r
 .ant-form-item-label {\r
     text-align: left;\r
+}\r
+.validation_alert {\r
+    color: red;\r
+    position: absolute;\r
+    top: 0;\r
+    margin-top: 15px;\r
+}\r
+.validation_alert_area {\r
+    color: red;\r
+    position: absolute;\r
+    top: 0;\r
+    margin-top: 35px;\r
+    margin-left: 15px;\r
+}\r
+.endpoint_input {\r
+    position: relative;\r
+    .end_alert_ip {\r
+        position: absolute;\r
+        color: red;\r
+        top: 0;\r
+        margin-top: 30px;\r
+    }\r
+    .end_alert_logical {\r
+        position: absolute;\r
+        color: red;\r
+        top: 0;\r
+        margin: 30px 0 0 120px;\r
+    }\r
 }
\ No newline at end of file
index bceca19..5bed207 100644 (file)
@@ -1,5 +1,6 @@
-import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
-import { TRANSFRER_FORM_ITEMS, CORE_FORM_ITEMS, ADDRESS , NexthopInfo_Options } from '@src/constants/constants'
+import { Component, OnInit, Input, Output, EventEmitter, ElementRef } from '@angular/core';
+import { TRANSFRER_FORM_ITEMS, CORE_FORM_ITEMS, ADDRESS , NexthopInfo_Options } from '@src/constants/constants';
+import { NzMessageService } from "ng-zorro-antd";
 
 @Component({
        selector: 'app-subnet-params-model',
@@ -15,23 +16,29 @@ export class SubnetParamsModelComponent implements OnInit {
        @Output() paramsDataChange = new EventEmitter<any>();
 
        transferFormItems = TRANSFRER_FORM_ITEMS;
-       coreFormItems: any[] = [];
+       formData: any;
+       coreFormItems : any = [];
        areaList: any[] = [];
     // 2020.08.17  Add 3 parameters for Endpoint, Comment: The following code
     NexthopInfoOptions = NexthopInfo_Options;
     EndpointInputs: any[] = [];
-    EndpointEnable: boolean = false;  // Whether to enable the three parameters of Endpoint
+       EndpointEnable: boolean = true;  // Whether to enable the three parameters of Endpoint
     //  Comment: Above code
 
-       constructor() { }
+       constructor(
+               private message: NzMessageService,
+               ) {
+               }
 
-       ngOnInit() { }
+       ngOnInit() {
+        }
 
        ngOnChanges() {
                if(this.title){
-            this.coreFormItems = this.title === 'An'?CORE_FORM_ITEMS.An:this.title === 'Cn'?CORE_FORM_ITEMS.Cn:[];
-            if(this.detailData !==undefined && Object.keys(this.detailData).length!==0){
-                this.EndpointEnable = (this.detailData.hasOwnProperty("an_Endpoint") && this.detailData['an_Endpoint'].length!==0) || (this.detailData.hasOwnProperty("cn_Endpoint") && this.detailData['cn_Endpoint'].length!==0)
+                       this.coreFormItems = this.title === 'An'?CORE_FORM_ITEMS.An:this.title === 'Cn'?CORE_FORM_ITEMS.Cn:[];
+                       this.formData = JSON.parse(JSON.stringify(this.detailData));
+            if(this.formData !==undefined && Object.keys(this.formData).length!==0){
+                this.EndpointEnable = (this.formData.hasOwnProperty("an_Endpoint") && this.formData['an_Endpoint'].length!==0) || (this.formData.hasOwnProperty("cn_Endpoint") && this.formData['cn_Endpoint'].length!==0)
             }
             // -------> 2020.08.17  Add 3 parameters for Endpoint, Comment: The following code
             if(this.EndpointEnable){
@@ -53,9 +60,62 @@ export class SubnetParamsModelComponent implements OnInit {
                        this.AreaFormatting();
                }
        }
-
+       validateEndPoint (key: string, value: any): string {
+               if (value === '') {
+                       return 'can not be empty';
+               }
+               if (key === 'ip_address') {
+                       const regxp = /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/;
+                       if (!regxp.test(value)) {
+                               return 'xxx.xxx.xxx.xxx';
+                       } else {
+                               return '';
+                       }
+               } else if (key === 'logical_link') {
+                       return '';
+               } else {
+                       return '';
+               }
+       }
+       // endPointOnBlur ($event:any, title: string): void {
+       //      const target = $event.target;
+       //      if (title === 'ip_address') {
+       //              const regxp = /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/;
+       //              if (!regxp.test(target.value)) {
+       //                      target.value = '';
+       //                      this.message.error('Please enter legal IP address');
+       //              }
+       //      }
+       // }
+       // endPointEnter ($event:any, title: string): void {
+       //      if ($event.keyCode === 13) {
+       //              const target = $event.target;
+       //              if (title === 'ip_address') {
+       //                      const regxp = /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/;
+       //                      if (!regxp.test(target.value)) {
+       //                              target.value = '';
+       //                              this.message.error('Please enter legal IP address');
+       //                      }
+       //              }
+       //      }
+       // }
+       onInput ($event:any, title: string) {
+               if (!$event) {
+                       return;
+               }
+               const target = $event.target;
+               if (title === 'ip_address') {
+                   // only number and '.' can be inputted
+                       const regexp = /[^\d^\.]+/g;
+                       target.value = target.value.replace(regexp, '');
+               } else if (title === 'logical_link') {
+                   // only number can be inputted
+                       const regxp = /[^\d]/g;
+                       target.value = target.value.replace(regxp, '');
+               }
+       }
        AreaFormatting () {
-               let areaList = [...this.detailData.an_coverage_area_ta_list];
+               let areaList = [...this.formData.an_coverage_area_ta_list];
                this.areaList = areaList.map ( (item: any) => {
                        let arr = item.split(';');
                        item = arr.map( (ite, index) => {
@@ -138,9 +198,88 @@ export class SubnetParamsModelComponent implements OnInit {
                this.showModel = false
                this.cancel.emit(this.showModel)
        }
+       
+       checkArea () {
+               let result = true;
+               console.log(this.areaList);
+               this.areaList.forEach((item) => {
+                       if (item.some((val) => {return val['selected'] === ''})) {
+                               result = false;
+                       }
+               })
+               if (!result) {
+                       return 'can not be empty!';
+               } else {
+                       return '';
+               }
+       }
+
+       judgeType (a) {
+               return Object.prototype.toString.call(a)
+       }
+
+       // used to verify that each item is not empty in a object
+       deepCheck (target) {
+               let type = this.judgeType(target);
+               if (type === '[object Array]') {
+                       for (let i = 0; i < target.length; i++) {
+                               if (!this.deepCheck(target[i])) {
+                                       return false;
+                               }
+                         }
+               } else if (type === '[object Object]') {
+                       for (const prop in target) {
+                               if (target.hasOwnProperty(prop)) { // special handling for address
+                                 if (prop === 'an_coverage_area_ta_list' || prop ==='cn_coverage_area_ta_list') {
+                                         return target[prop].every((item) => {return this.deepCheck(item.split(';'))});
+                                 } else if (!this.deepCheck(target[prop])) {
+                                         return false;
+                                 }
+                               }
+                       }
+               } else {
+                       if (!target && target!==0) {
+                               return false;
+                       } else {
+                               return true;
+                       }
+               }
+               return true;
+       }
+
+       // endCheckBeforeSubmit (params) {
+       //      let target;
+       //      if (this.title === 'An') {
+       //              target = params['an_Endpoint'];
+       //              for (let item of target) {
+       //                      if (Object.keys[0] === 'an_ip_address') { 
+       //                              const regxp = /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/;
+       //                              if (regxp.test(item['an_ip_address'])) {
+       //                                      this.message.error('illegal IpAddress');
+       //                                      return false;
+       //                              } 
+       //                      }
+       //              }
+       //      } else if (this.title === 'Cn'){
+       //              target = params['cn_Endpoint'];
+       //              for (let item of target) {
+       //                      if (Object.keys[0] === 'cn_ip_address') { 
+       //                              const regxp = /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/;
+       //                              if (regxp.test(item['cn_ip_address'])) {
+       //                                      this.message.error('illegal IpAddress');
+       //                                      return false;
+       //                              } 
+       //                      }
+       //              }
+       //      } else {
+       //              return true;
+       //      }
+       //      return true;
+       // }
 
        handleOk(): void {
                let params: object;
+               // Verify that each item is not empty
                if (this.title === 'An') {
                        const an_coverage_area_ta_list: string[] = [];
                        this.areaList.forEach( item => {
@@ -150,12 +289,16 @@ export class SubnetParamsModelComponent implements OnInit {
                                })
                                an_coverage_area_ta_list.push(str.substring(0, str.length-1));
                        })
-                       params = {...this.detailData, an_coverage_area_ta_list}
+                       params = {...this.formData, an_coverage_area_ta_list};
+               } else {
+                       params = {...this.formData};
+               }
+               if (this.deepCheck(params)) {
+                       this.paramsDataChange.emit(params);
+                       this.handleCancel();
                } else {
-                       params = {...this.detailData}
+                       this.message.error('Please complete the form');
                }
-               this.paramsDataChange.emit(params)
-               this.handleCancel()
        }
 
 }
index 3469dd9..412db5c 100644 (file)
@@ -197,11 +197,13 @@ export const CORE_FORM_ITEMS = {
             options: [\r
                 {\r
                     title: 'ip_address',\r
-                    key: 'an_ip_address'\r
+                    key: 'an_ip_address',\r
+                    holder: 'IpAddress'\r
                 },\r
                 {\r
                     title: 'logical_link',\r
-                    key: 'an_logical_link'\r
+                    key: 'an_logical_link',\r
+                    holder: 'LogicId'\r
                 },\r
                 {\r
                     title: 'nexthop_info',\r
@@ -297,11 +299,13 @@ export const CORE_FORM_ITEMS = {
             options: [\r
                 {\r
                     title: 'ip_address',\r
-                    key: 'cn_ip_address'\r
+                    key: 'cn_ip_address',\r
+                    holder: 'IpAddress'\r
                 },\r
                 {\r
                     title: 'logical_link',\r
-                    key: 'cn_logical_link'\r
+                    key: 'cn_logical_link',\r
+                    holder: 'LogicId'\r
                 },\r
                 {\r
                     title: 'nexthop_info',\r