From 928d55a8fde33200bb1ca4016ce5b86e9a1118a8 Mon Sep 17 00:00:00 2001 From: fengxiang <110431245@qq.com> Date: Tue, 16 Jan 2018 16:57:13 +0800 Subject: [PATCH] 组织配置 --- src/app/business/enum/types.enum.ts | 1 src/app/business/entity/data.ts | 26 ++ src/app/business/services/http/sensors.service.ts | 4 src/app/routes/systems/organization/organization.component.ts | 1 src/app/routes/systems/systems.module.ts | 1 src/app/routes/systems/organization/organization-config/organization-config.component.ts | 330 ++++++++++++++++++++++++------------ src/app/routes/systems/organization/organization-config/organization-config.component.html | 119 +++++-------- src/app/business/enum/patterns.enum.ts | 3 src/app/business/services/http/alarm-config.service.ts | 39 ++++ 9 files changed, 329 insertions(+), 195 deletions(-) diff --git a/src/app/business/entity/data.ts b/src/app/business/entity/data.ts index d6f454c..595ad88 100644 --- a/src/app/business/entity/data.ts +++ b/src/app/business/entity/data.ts @@ -1,4 +1,5 @@ import { Column } from '@business/entity/grid'; +import { AlarmStyle } from '@business/enum/types.enum'; export interface AreaNames { @@ -63,10 +64,31 @@ } // ������������ + + export interface AlarmConfig { - createTime?: number; id?: number; organizationId?: number; + createTime?: number; updateTime?: number; - value?: object; + value: AlarmConfigValue; } + +export interface AlarmConfigValue { + alarmMode: AlarmMode; + alarmLevels:{[key: string]:AlarmSensorLevel}; +} + + +export interface AlarmSensorLevel { + enable: boolean|any []; + increment: number []|any[]; + degression: number []|any []; +} + +export interface AlarmMode { + enable: boolean|any[]; + level1: AlarmStyle[]|any[]; + level2: AlarmStyle[]|any[]; + level3: AlarmStyle[]|any[]; +} \ No newline at end of file diff --git a/src/app/business/enum/patterns.enum.ts b/src/app/business/enum/patterns.enum.ts new file mode 100644 index 0000000..ce81f20 --- /dev/null +++ b/src/app/business/enum/patterns.enum.ts @@ -0,0 +1,3 @@ +export enum patterns{ + num = '\\d+(\\.\\d+)?' +} diff --git a/src/app/business/enum/types.enum.ts b/src/app/business/enum/types.enum.ts index b1a5157..7fdb678 100644 --- a/src/app/business/enum/types.enum.ts +++ b/src/app/business/enum/types.enum.ts @@ -1,7 +1,6 @@ export enum Types { Date, Json } - export enum AlarmStyle { //��������������������������������� weixin='weixin',email='email',sms='sms',voice='voice' diff --git a/src/app/business/services/http/alarm-config.service.ts b/src/app/business/services/http/alarm-config.service.ts index 6db6cbf..9a925c2 100644 --- a/src/app/business/services/http/alarm-config.service.ts +++ b/src/app/business/services/http/alarm-config.service.ts @@ -3,17 +3,52 @@ import { environment } from '@env/environment'; import { Observable } from 'rxjs/Observable'; import { ResultBean } from '@business/entity/grid'; -import { AlarmConfig } from '@business/entity/data'; +import { AlarmConfig, AlarmConfigValue,AlarmSensorLevel, AlarmMode } from '@business/entity/data'; @Injectable() export class AlarmConfigService { private urls = { - getByOid: environment.SERVER_BASH_URL + 'alarm-config/get-by-oid' + getByOid: environment.SERVER_BASH_URL + 'alarm-config/get-by-oid', + save: environment.SERVER_BASH_URL + '/alarm-config/add-or-modify', }; constructor( private http: _HttpClient) { } + public generateAlarmConfig(sensors: {key:string} [],alarmConfig?: AlarmConfig): AlarmConfig{ + const _alarmConfig : AlarmConfig = alarmConfig==null || alarmConfig.value == null ? {value:{ + alarmLevels:null, + alarmMode:null + }}: alarmConfig; + let alarmLevels = _alarmConfig.value.alarmLevels; + alarmLevels = alarmLevels ==null ?{} :alarmLevels; + sensors.forEach( + sensor => { + const key = sensor.key; + alarmLevels[key] = + alarmLevels[key] == null ? + { + enable: false, + increment: [0,0,0], + degression: [0,0,0] + } : alarmLevels[key]; + } + ); + _alarmConfig.value.alarmLevels = alarmLevels; + //������������ + let alarmMode = _alarmConfig.value.alarmMode; + alarmMode = alarmMode == null ? { + enable: false, + level1: null, + level2: null, + level3: null + } : alarmMode; + _alarmConfig.value.alarmMode = alarmMode; + return _alarmConfig; + } public getByOid(oid:number):Observable<ResultBean<AlarmConfig>>{ return this.http.get(this.urls.getByOid,{organizationId:oid}); } + public save(data: any): Observable<ResultBean<any>> { + return this.http.post(this.urls.save, data); + } } diff --git a/src/app/business/services/http/sensors.service.ts b/src/app/business/services/http/sensors.service.ts index af04f91..5ba7466 100644 --- a/src/app/business/services/http/sensors.service.ts +++ b/src/app/business/services/http/sensors.service.ts @@ -10,7 +10,7 @@ @Injectable() export class SensorsService { private urls = { - edit: environment.SERVER_BASH_URL + '/sensor/page-list', + list: environment.SERVER_BASH_URL + '/sensor/page-list', save: environment.SERVER_BASH_URL + '/sensor/add-or-modify', delete: environment.SERVER_BASH_URL + '/sensor/delete-by-ids' }; @@ -27,7 +27,7 @@ } const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, queryParams: example.getSqlParam(), orderByClause: orderByClause}; - return this.http.get(this.urls.edit, param); + return this.http.get(this.urls.list, param); } public save(data: any): Observable<any> { return this.http.post(this.urls.save, data); diff --git a/src/app/routes/systems/organization/organization-config/organization-config.component.html b/src/app/routes/systems/organization/organization-config/organization-config.component.html index b5a2a48..5d53391 100644 --- a/src/app/routes/systems/organization/organization-config/organization-config.component.html +++ b/src/app/routes/systems/organization/organization-config/organization-config.component.html @@ -8,7 +8,7 @@ <label nz-checkbox formControlName="_allChecked" [nzIndeterminate]="indeterminate" (ngModelChange)="checkAll($event)"></label> </th> <th nz-th> - ��������������� + ���������������(������) </th> <th nz-th> ������ @@ -30,94 +30,67 @@ </th> </tr> </thead> - <tbody nz-tbody> - <tr nz-tbody-tr *ngFor="let row of nzTable.data"> + <tbody formGroupName="alarmLevels" nz-tbody> + <tr nz-tbody-tr *ngFor="let row of nzTable.data" formGroupName="{{row.key}}"> + <td nz-td [nzCheckbox]="true"> - <label nz-checkbox formControlName="{{row.key}}_enable"></label> + <label nz-checkbox formControlName="enable"></label> </td> <td> <span> - {{ row.name }} + {{ row.name }}({{ row.unit }}) </span> </td> - <td> + <td formArrayName="increment" *ngFor="let in of validateForm.get('alarmLevels.'+row.key+'.increment').controls; index as i"> + <div nz-form-item> + <div nz-form-control nzHasFeedback> + <nz-input [formControlName]="i" maxlength="20" nzDisabled="{{ !f.value['alarmLevels'][row.key]['enable'] }}"></nz-input> + </div> + </div> + </td> + <td formArrayName="degression" *ngFor="let in of validateForm.get('alarmLevels.'+row.key+'.degression').controls; index as i"> <div nz-form-item> <div nz-form-control nzHasFeedback> - <nz-input formControlName="{{row.key}}_level_increment_1" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> + <nz-input [formControlName]="i" maxlength="20" nzDisabled="{{ !f.value['alarmLevels'][row.key]['enable'] }}"></nz-input> </div> </div> - </td> - <td> - <div nz-form-item> - <div nz-form-control nzHasFeedback> - <nz-input formControlName="{{row.key}}_level_increment_2" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}" - validateGreater></nz-input> - </div> - </div> - </td> - <td> - <div nz-form-item> - <div nz-form-control nzHasFeedback> - <nz-input formControlName="{{row.key}}_level_increment_3" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> - </div> - </div> - </td> - <td> - <div nz-form-item> - <div nz-form-control nzHasFeedback> - <nz-input formControlName="{{row.key}}_level_degression_1" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> - </div> - </div> - </td> - <td> - <div nz-form-item> - <div nz-form-control nzHasFeedback> - <nz-input formControlName="{{row.key}}_level_degression_2" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> - </div> - </div> - </td> - <td> - <div nz-form-item> - <div nz-form-control nzHasFeedback> - <nz-input formControlName="{{row.key}}_level_degression_3" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> - </div> - </div> - </td> + </td> </tr> </tbody> </nz-table> </nz-card> <div [ngStyle]="{'background-color':'#f5f7fa','width':'110%','left':'-5%','height':'20px','position':'relative'}"></div> - <nz-card [nzBordered]="false" nzTitle="������������"> - <label nz-checkbox formControlName="mode_enable"> - <span>������������</span> - </label> - <div [ngStyle]="{'margin-left': '20%'}"> - <br/> - <br/> - <br/> - <div *ngFor="let i of [1,2,3]" nz-form-item nz-row class="mb-sm"> - <div nz-form-label nz-col [nzSm]="3" [nzXs]="24"> - <span [ngSwitch]="i"> - <label *ngSwitchCase="1">������������������:</label> - <label *ngSwitchCase="2">������������������:</label> - <label *ngSwitchCase="3">������������������:</label> - </span> + <nz-card [nzBordered]="false" nzTitle="������������" formGroupName="alarmMode"> + <label nz-checkbox formControlName="enable"> + <span>������������</span> + </label> + <div [ngStyle]="{'margin-left': '20%'}"> + <br/> + <br/> + <br/> + <div *ngFor="let i of [1,2,3]" nz-form-item nz-row class="mb-sm"> + <div nz-form-label nz-col [nzSm]="3" [nzXs]="24"> + <span [ngSwitch]="i"> + <label *ngSwitchCase="1">������������������:</label> + <label *ngSwitchCase="2">������������������:</label> + <label *ngSwitchCase="3">������������������:</label> + </span> + </div> + <div nz-form-control nz-col [nzSpan]="12" nzHasFeedback> + <nz-select formControlName="{{ 'level'+i }}" [nzMode]="'multiple'" [nzPlaceHolder]="'������ ������������'" [nzNotFoundContent]="'������������'" + nzDisabled="{{ !f.value['alarmMode']['enable'] }}"> + <nz-option *ngFor="let option of alarmModes" [nzLabel]="option.label" [nzValue]="option.value" [nzDisabled]="option.disabled"> + </nz-option> + </nz-select> + </div> + <br/> + <br/> + <br/> </div> - <div nz-form-control nz-col [nzSpan]="12" nzHasFeedback> - <nz-select formControlName="mode_level{{i}}" [nzMode]="'multiple'" [nzPlaceHolder]="'������ ������������'" [nzNotFoundContent]="'������������'" - nzDisabled="{{ !f.value['mode_enable'] }}"> - <nz-option *ngFor="let option of alarmModes" [nzLabel]="option.label" [nzValue]="option.value" [nzDisabled]="option.disabled"> - </nz-option> - </nz-select> - </div> - <br/> - <br/> - <br/> </div> - </div> - </nz-card> - <footer-toolbar ng-content = '������������' errorCollect> + </nz-card> + <footer-toolbar errorCollect> + <span [ngStyle]="{'color':'red','width':'300px','margin-right':'40px'}">{{ errorMessage }}</span> <label>���������������</label> <span [ngStyle]="{'font-size': '16px','font-weight': 'bold','margin-right':'30px'}">{{ organization.name }}</span> <button nz-button type="button" (click)="backToList()">������</button> @@ -127,5 +100,5 @@ <span *ngIf="isSaving">���</span> </span> </button> - </footer-toolbar> + </footer-toolbar> </form> diff --git a/src/app/routes/systems/organization/organization-config/organization-config.component.ts b/src/app/routes/systems/organization/organization-config/organization-config.component.ts index 100d3a0..3d385de 100644 --- a/src/app/routes/systems/organization/organization-config/organization-config.component.ts +++ b/src/app/routes/systems/organization/organization-config/organization-config.component.ts @@ -1,14 +1,16 @@ +import { NzMessageService } from 'ng-zorro-antd'; import { filter } from 'rxjs/operators'; import { HttpClient } from '@angular/common/http'; -import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms'; +import { FormGroup, FormBuilder, FormControl, Validators, FormArray } from '@angular/forms'; import { SensorsService } from '@business/services/http/sensors.service'; import { Grid, PageBean } from '@business/entity/grid'; -import { Organization } from '@business/entity/data'; +import { Organization, AlarmConfig, AlarmSensorLevel, AlarmConfigValue } from '@business/entity/data'; import { Component, OnInit, OnDestroy } from '@angular/core'; import { OrganizationService } from '@business/services/http/organization.service'; import { _HttpClient } from '@delon/theme'; import { AlarmConfigService } from '@business/services/http/alarm-config.service'; import { AlarmStyle } from '@business/enum/types.enum'; +import { patterns } from '@business/enum/patterns.enum'; @Component({ selector: 'app-organization-config', @@ -20,15 +22,17 @@ ngOnDestroy(): void { this.backToList(); } - private organization:Organization; + private organization: Organization; grid: Grid<object> = new Grid<object>(null); validateForm: FormGroup; constructor( private organizationService: OrganizationService, private sensorsService: SensorsService, - private alarmConfigService:AlarmConfigService, + private alarmConfigService: AlarmConfigService, private formBuilder: FormBuilder, - private http: _HttpClient + private http: _HttpClient, + public msgSrv: NzMessageService + ) { this.organization = this.organizationService.data; } @@ -36,126 +40,226 @@ ngOnInit() { this.load(); } - load(reload: boolean = false) { + load(reload: boolean = false) { if (reload) { - this.grid.pageIndex = 1 ; + this.grid.pageIndex = 1; } - // TODO // ������������������ExpressionChangedAfterItHasBeenCheckedError - // setTimeout(() => { - // this.grid.loading = true; - // }, 1); - let pageBean = this.organizationService.config.pageBean;// - let resultBean = this.organizationService.config.resultBean; - resultBean = resultBean == null?{} : resultBean; - if (pageBean != null && pageBean.data != null) { - this.grid.initData(pageBean); - this.grid.refreshStatus(); + setTimeout(() => { + this.grid.loading = true; + }, 1); + let pageBean = this.organizationService.config.pageBean; + let resultBean = this.organizationService.config.resultBean; + resultBean = resultBean == null ? {} : resultBean; + if (pageBean != null && pageBean.data != null) { + this.grid.initData(pageBean); + let alarmConfig: AlarmConfig = null; + if (resultBean == null || resultBean.data == null) { + alarmConfig = this.alarmConfigService.generateAlarmConfig(pageBean.data); + } else { + // ������ ������ ��������� + alarmConfig = this.alarmConfigService.generateAlarmConfig(pageBean.data, resultBean.data); + } + const alarmConfigValue = alarmConfig.value; + + const alarmLevels = alarmConfigValue.alarmLevels; + let alarmLevelsGroupsConfig = {}; + Object.keys(alarmLevels).forEach(key => { + + let increment = alarmLevels[key].increment; + increment = increment == null || increment.length != 3 ? [0, 0, 0] : increment; + const incrementArray = this.formBuilder.array([ + [increment[0], Validators.pattern(patterns.num)], + [increment[1], Validators.pattern(patterns.num)], + [increment[2], Validators.pattern(patterns.num)] + ]); + let degression = alarmLevels[key].degression; + degression = degression == null || degression.length != 3 ? [0, 0, 0] : degression; + const degressionArray = + this.formBuilder.array([ + [degression[0], Validators.pattern(patterns.num)], + [degression[1], Validators.pattern(patterns.num)], + [degression[2], Validators.pattern(patterns.num)] + ]); + const alarmSensorGroup = this.formBuilder.group( + { + enable: [alarmLevels[key].enable], + increment: incrementArray, + degression: degressionArray, + }, { validator: this.alarmLevelValidator } + ); + alarmSensorGroup.get('enable').valueChanges.subscribe( + (value: any) => { + if (this._allCheckTriggers <= 0) { + this.refreshIndeterminate(); + } else { + this._allCheckTriggers--; + } + } + ); + alarmLevelsGroupsConfig[key] = alarmSensorGroup; + }); + this.alarmModes.push( + { label: '������', value: AlarmStyle.email, disabled: false }, + { label: '������', value: AlarmStyle.sms, disabled: false }, + { label: '������', value: AlarmStyle.voice, disabled: false }, + { label: '������', value: AlarmStyle.weixin, disabled: false } + ); + const alarmMode = alarmConfigValue.alarmMode; + this.validateForm = this.formBuilder.group({ + alarmLevels: this.formBuilder.group(alarmLevelsGroupsConfig), + alarmMode: this.formBuilder.group( + { + enable: [alarmMode.enable], + level1: [alarmMode.level1], + level2: [alarmMode.level2], + level3: [alarmMode.level3] + } + ), + '_id':alarmConfig.id, + '_allChecked': [] + }); + this.validateForm.statusChanges.subscribe( + item => { + this.setErrorMessage(); + } + ) + this.refreshIndeterminate(); + } + // ������������������ExpressionChangedAfterItHasBeenCheckedError setTimeout(() => { this.grid.loading = false; }, 1); - let validates = {}; - let data = resultBean.data == null ?{}:resultBean.data; - const value = data['value'] == null ? {} : data['value']; - let alarmLevels = value['alarmLevels']; - alarmLevels = alarmLevels==null ? {} : alarmLevels; - // ������������ - const level_num = 3; - this.grid.data.forEach( - (sensor: object) => { - const sensorLevel = alarmLevels[sensor['key']] == null ?{}:alarmLevels[sensor['key']]; - const enable_key = sensor['key'] + '_enable'; - const enable_value = sensorLevel['enable'] == null ? false : sensorLevel['enable'] == 1; - validates[enable_key] = enable_value; - const increments:number[] = sensorLevel['increment']; - const degression:number[] = sensorLevel['degression']; - for(let i=0;i<level_num;i++){ - const increment_key = sensor['key']+'_level_increment_'+(i+1); - if( increments == null || increments.length == 0 ){ - validates[increment_key] = [null,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; - }else{ - const increment_value = increments.length>i ? increments[i]:null ; - validates[increment_key] = [increment_value,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; - } - const degression_key = sensor['key']+'_level_degression_'+(i+1); - if( degression == null || degression.length == 0 ){ - validates[degression_key] = [null,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; - }else{ - const degression_value = degression.length>i ? degression[i]:null ; - validates[degression_key] = [degression_value,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; - } - } - - } - ); - validates['_allChecked'] = [this.grid.allChecked]; - //������������������ - let alarmMode = value['alarmMode']; - alarmMode = alarmMode==null ? {}: alarmMode; - this.alarmModes.push( - {label:'������',value:AlarmStyle.email, disabled: false}, - {label:'������',value:AlarmStyle.sms, disabled: false}, - {label:'������',value:AlarmStyle.voice, disabled: false}, - {label:'������',value:AlarmStyle.weixin, disabled: false} - ); - validates['mode_enable'] = [alarmMode['enable']]; - for(let i = 0; i<level_num; i++){ - const n = i+1; - validates['mode_level'+n] = [AlarmStyle[alarmMode['level'+n]]]; - } - this.validateForm = this.formBuilder.group(validates); - this.grid.loading = false; - this.enableKeys = Object.keys(this.validateForm.value).filter( - (key: string) => { - return key.endsWith('_enable'); - } - ); - this.enableKeys.forEach( - (key: string) => { - this.validateForm.controls[key].valueChanges.subscribe( - (value: any) => { - if(this._allCheckTriggers <= 0){ - this.refreshIndeterminate(); - } else { - this._allCheckTriggers--; - } - } - ); - } - ); - this.refreshIndeterminate(); - } - } - alarmModes: {label:string,value:AlarmStyle,disabled: boolean} [] = []; - + alarmModes: { label: string, value: AlarmStyle, disabled: boolean }[] = []; backToList() { this.organizationService.handle = 'list'; this.organizationService.title = '������������'; } - enableKeys: string []; - indeterminate: boolean; - checkAll(param){ - this._allCheckTriggers = 0; - this.enableKeys.forEach( - (key: string) => { - this._allCheckTriggers++; - this.validateForm.controls[key].setValue(param); - } - ); - this.refreshIndeterminate(); - } - private _allCheckTriggers: number = 0; - refreshIndeterminate(){ - const allChecked = this.enableKeys.every(key => this.validateForm.controls[key].value); - const allUnChecked = this.enableKeys.every(key => !this.validateForm.controls[key].value); - this.indeterminate = (!allChecked) && (!allUnChecked); - } - save($event, value, valid) { + indeterminate: boolean; + checkAll(param) { + const keys = this.grid.data.map( + item => { + return item['key']; + } + ); + this._allCheckTriggers = 0; + keys.forEach( + (key: string) => { + this._allCheckTriggers++; + this.validateForm.get('alarmLevels.' + key + '.enable').setValue(param); + } + ); + this.refreshIndeterminate(); + } + private _allCheckTriggers: number = 0; + refreshIndeterminate() { + const keys = this.grid.data.map( + item => { + return item['key']; + } + ); + const allChecked = keys.every(key => this.validateForm.get('alarmLevels.' + key + '.enable').value); + const allUnChecked = keys.every(key => !this.validateForm.get('alarmLevels.' + key + '.enable').value); + this.indeterminate = (!allChecked) && (!allUnChecked); + } + save($event, value, valid) { $event.preventDefault(); if (valid) { - - + const data:AlarmConfig = { + id:value._id, + organizationId:this.organization.id, + value:value + } + this.alarmConfigService.save(data).subscribe( + result => { + if(result!=null&&result.code==1){ + this.msgSrv.success(this.organization.name+' ���������������'); + this.backToList(); + } + } + ); } - } + } + + setErrorMessage(){ + this.errorMessage = ''; + const errObj = this.getLastError(this.validateForm); + if(errObj!=null&&Object.keys(errObj).length>0){ + if(errObj['increment']){ + this.errorMessage = '������ ������ ������ ������������'; + } else if(errObj['degression']){ + this.errorMessage = '������������ ������������ ������������ ������������'; + } else if(errObj['pattern']!=null&&errObj['pattern']['requiredPattern'] == '^'+patterns.num.toString()+'$'){ + this.errorMessage = '���������������������'; + } + } +} + errorMessage:string = ''; + private alarmLevelValidator = (control: FormControl): { [s: string]: boolean } => { + let result = {}; + const i0 = control.get("increment.0"); + const i1 = control.get("increment.1"); + const i2 = control.get("increment.2"); + if ((i0.value != 0 || i1.value != 0 || i2.value != 0)&&(i0.value >= i1.value||i1.value >= i2.value)) { + i0.setErrors({ increment: true }); + i0.markAsDirty(); + i1.setErrors({ increment: true }); + i1.markAsDirty(); + i2.setErrors({ increment: true }); + i2.markAsDirty(); + result["increment"] = true; + }else{ + if(i0.hasError('increment')&&Object.keys(i0.errors).length==1){ + i0.setErrors(null); + } + if(i1.hasError('increment')&&Object.keys(i1.errors).length==1){ + i1.setErrors(null); + } + if(i2.hasError('increment')&&Object.keys(i2.errors).length==1){ + i2.setErrors(null); + } + } + const d0 = control.get("degression.0"); + const d1 = control.get("degression.1"); + const d2 = control.get("degression.2"); + if ((d0.value != 0 || d1.value != 0 || d2.value != 0)&&(d1.value >= d0.value||d2.value >= d1.value)) { + d0.setErrors({ degression: true }); + d0.markAsDirty(); + d1.setErrors({ degression: true }); + d1.markAsDirty(); + d2.setErrors({ degression: true }); + d2.markAsDirty(); + result["degression"] = true; + }else{ + if(d0.hasError('degression')&&Object.keys(d0.errors).length==1){ + d0.setErrors(null); + } + if(d1.hasError('degression')&&Object.keys(d1.errors).length==1){ + d1.setErrors(null); + } + if(d2.hasError('degression')&&Object.keys(d2.errors).length==1){ + d2.setErrors(null); + } + } + return Object.keys(result).length == 0?null:result; + }; + getLastError(control:FormGroup|FormArray){ + if(control.errors!=null){ + return control.errors; + }else{ + const controls = Object.values(control.controls); + for(let i = controls.length-1;i>=0;i--){ + const c = controls[i]; + if(c.errors!=null){ + return c.errors; + }else if(c instanceof FormArray||c instanceof FormGroup){ + const result = this.getLastError(c); + if(result != null) { + return result; + } + } + } + } + } } diff --git a/src/app/routes/systems/organization/organization.component.ts b/src/app/routes/systems/organization/organization.component.ts index d417498..474aac0 100644 --- a/src/app/routes/systems/organization/organization.component.ts +++ b/src/app/routes/systems/organization/organization.component.ts @@ -10,7 +10,6 @@ }) export class OrganizationComponent implements OnInit { ngOnInit(): void { - } constructor( private organizationService: OrganizationService diff --git a/src/app/routes/systems/systems.module.ts b/src/app/routes/systems/systems.module.ts index 257790b..eae0bff 100644 --- a/src/app/routes/systems/systems.module.ts +++ b/src/app/routes/systems/systems.module.ts @@ -1,4 +1,3 @@ -import { EqualValidator } from '@business/validators/equal-validator.directive'; import { FormBuilder } from '@angular/forms'; import { _HttpClient } from '@delon/theme'; import { Component, OnInit } from '@angular/core'; -- Gitblit v1.8.0