Skip to content

Commit 0c9287a

Browse files
authored
feat(module:input-number): support setting status (#7462)
* feat(module:input-number): support setting status * feat(module:input-number): add tests for status
1 parent e34ed5c commit 0c9287a

File tree

7 files changed

+106
-4
lines changed

7 files changed

+106
-4
lines changed

components/cascader/cascader.spec.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
dispatchKeyboardEvent,
3232
dispatchMouseEvent
3333
} from 'ng-zorro-antd/core/testing';
34+
import { NzStatus } from 'ng-zorro-antd/core/types';
3435
import { NzIconTestModule } from 'ng-zorro-antd/icon/testing';
3536

3637
import { NzCascaderComponent } from './cascader.component';
@@ -2205,5 +2206,5 @@ export class NzDemoCascaderRtlComponent {
22052206
})
22062207
export class NzDemoCascaderStatusComponent {
22072208
public nzOptions: any[] | null = options1;
2208-
public status = 'error';
2209+
public status: NzStatus = 'error';
22092210
}
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
order: 6
3+
title:
4+
zh-CN: 自定义状态
5+
en-US: Status
6+
---
7+
8+
## zh-CN
9+
10+
使用 `nzStatus` 为 InputNumber 添加状态,可选 `error` 或者 `warning`
11+
12+
## en-US
13+
14+
Add status to InputNumber with `nzStatus`, which could be `error` or `warning`.
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Component } from '@angular/core';
2+
3+
@Component({
4+
selector: 'nz-demo-input-number-status',
5+
template: `
6+
<nz-input-number [nzStep]="1" nzStatus="error"></nz-input-number>
7+
<nz-input-number [nzStep]="1" nzStatus="warning"></nz-input-number>
8+
`,
9+
styles: [
10+
`
11+
nz-input-number {
12+
width: 100%;
13+
margin-bottom: 8px;
14+
}
15+
`
16+
]
17+
})
18+
export class NzDemoInputNumberStatusComponent {}

components/input-number/doc/index.en-US.md

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { NzInputNumberModule } from 'ng-zorro-antd/input-number';
3232
| `[nzPrecision]` | precision of input value | `number` | - |
3333
| `[nzPrecisionMode]` | The method for calculating the precision of input value | `'cut' \| 'toFixed' \| ((value: number \| string, precision?: number) => number)` | `'toFixed'` |
3434
| `[nzSize]` | width of input box | `'large' \| 'small' \| 'default'` | `'default'` |
35+
| `[nzStatus]` | Set validation status | `'error' \| 'warning'` | - |
3536
| `[nzStep]` | The number to which the current value is increased or decreased. It can be an integer or decimal. | `number \| string` | `1` |
3637
| `[nzInputMode]` | enumerated attribute that hints at the type of data that might be entered by the user, [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode) | `string` | `decimal` |
3738
| `[nzPlaceHolder]` | Placeholder of select | `string` | - |

components/input-number/doc/index.zh-CN.md

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { NzInputNumberModule } from 'ng-zorro-antd/input-number';
3333
| `[nzPrecision]` | 数值精度 | `number` | - |
3434
| `[nzPrecisionMode]` | 数值精度的取值方式 | `'cut' \| 'toFixed' \| ((value: number \| string, precision?: number) => number)` | `'toFixed'` |
3535
| `[nzSize]` | 输入框大小 | `'large' \| 'small' \| 'default'` | `'default'` |
36+
| `[nzStatus]` | 设置校验状态 | `'error' \| 'warning'` | - |
3637
| `[nzStep]` | 每次改变步数,可以为小数 | `number \| string` | `1` |
3738
| `[nzInputMode]` | 提供了用户在编辑元素或其内容时可能输入的数据类型的提示,详见[MDN](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Global_attributes/inputmode) | `string` | `decimal` |
3839
| `[nzPlaceHolder]` | 选择框默认文字 | `string` | - |

components/input-number/input-number.component.ts

+32-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
OnInit,
2222
Optional,
2323
Output,
24+
Renderer2,
2425
SimpleChanges,
2526
ViewChild,
2627
ViewEncapsulation
@@ -30,8 +31,15 @@ import { fromEvent, merge } from 'rxjs';
3031
import { takeUntil } from 'rxjs/operators';
3132

3233
import { NzDestroyService } from 'ng-zorro-antd/core/services';
33-
import { BooleanInput, NzSizeLDSType, OnChangeType, OnTouchedType } from 'ng-zorro-antd/core/types';
34-
import { InputBoolean, isNotNil } from 'ng-zorro-antd/core/util';
34+
import {
35+
BooleanInput,
36+
NgClassInterface,
37+
NzSizeLDSType,
38+
NzStatus,
39+
OnChangeType,
40+
OnTouchedType
41+
} from 'ng-zorro-antd/core/types';
42+
import { getStatusClassNames, InputBoolean, isNotNil } from 'ng-zorro-antd/core/util';
3543

3644
@Component({
3745
selector: 'nz-input-number',
@@ -109,6 +117,10 @@ export class NzInputNumberComponent implements ControlValueAccessor, AfterViewIn
109117
disabledUp = false;
110118
disabledDown = false;
111119
dir: Direction = 'ltr';
120+
// status
121+
prefixCls: string = 'ant-input-number';
122+
statusCls: NgClassInterface = {};
123+
nzHasFeedback: boolean = false;
112124
onChange: OnChangeType = () => {};
113125
onTouched: OnTouchedType = () => {};
114126
@Output() readonly nzBlur = new EventEmitter();
@@ -130,6 +142,7 @@ export class NzInputNumberComponent implements ControlValueAccessor, AfterViewIn
130142
@Input() nzPrecision?: number;
131143
@Input() nzPrecisionMode: 'cut' | 'toFixed' | ((value: number | string, precision?: number) => number) = 'toFixed';
132144
@Input() nzPlaceHolder = '';
145+
@Input() nzStatus?: NzStatus;
133146
@Input() nzStep = 1;
134147
@Input() nzInputMode: string = 'decimal';
135148
@Input() nzId: string | null = null;
@@ -376,6 +389,7 @@ export class NzInputNumberComponent implements ControlValueAccessor, AfterViewIn
376389
private elementRef: ElementRef<HTMLElement>,
377390
private cdr: ChangeDetectorRef,
378391
private focusMonitor: FocusMonitor,
392+
private renderer: Renderer2,
379393
@Optional() private directionality: Directionality,
380394
private destroy$: NzDestroyService
381395
) {}
@@ -434,11 +448,15 @@ export class NzInputNumberComponent implements ControlValueAccessor, AfterViewIn
434448
}
435449

436450
ngOnChanges(changes: SimpleChanges): void {
451+
const { nzStatus } = changes;
437452
if (changes.nzFormatter && !changes.nzFormatter.isFirstChange()) {
438453
const validValue = this.getCurrentValidValue(this.parsedValue!);
439454
this.setValue(validValue);
440455
this.updateDisplayValue(validValue);
441456
}
457+
if (nzStatus) {
458+
this.setStatusStyles();
459+
}
442460
}
443461

444462
ngAfterViewInit(): void {
@@ -463,4 +481,16 @@ export class NzInputNumberComponent implements ControlValueAccessor, AfterViewIn
463481
.subscribe(() => this.stop());
464482
});
465483
}
484+
485+
private setStatusStyles(): void {
486+
// render status if nzStatus is set
487+
this.statusCls = getStatusClassNames(this.prefixCls, this.nzStatus, this.nzHasFeedback);
488+
Object.keys(this.statusCls).forEach(status => {
489+
if (this.statusCls[status]) {
490+
this.renderer.addClass(this.elementRef.nativeElement, status);
491+
} else {
492+
this.renderer.removeClass(this.elementRef.nativeElement, status);
493+
}
494+
});
495+
}
466496
}

components/input-number/input-number.spec.ts

+38-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { By } from '@angular/platform-browser';
66
import { take } from 'rxjs/operators';
77

88
import { createKeyboardEvent, createMouseEvent, dispatchEvent, dispatchFakeEvent } from 'ng-zorro-antd/core/testing';
9+
import { NzStatus } from 'ng-zorro-antd/core/types';
910

1011
import { NzInputNumberComponent } from './input-number.component';
1112
import { NzInputNumberModule } from './input-number.module';
@@ -17,7 +18,8 @@ describe('input number', () => {
1718
declarations: [
1819
NzTestInputNumberBasicComponent,
1920
NzTestInputNumberFormComponent,
20-
NzTestReadOnlyInputNumberBasicComponent
21+
NzTestReadOnlyInputNumberBasicComponent,
22+
NzTestInputNumberStatusComponent
2123
]
2224
});
2325
TestBed.compileComponents();
@@ -517,6 +519,34 @@ describe('input number', () => {
517519
expect(inputElement.attributes.getNamedItem('readOnly')).toBe(null);
518520
});
519521
});
522+
523+
describe('input number status', () => {
524+
let fixture: ComponentFixture<NzTestInputNumberStatusComponent>;
525+
let testComponent: NzTestInputNumberStatusComponent;
526+
let inputNumber: DebugElement;
527+
528+
beforeEach(fakeAsync(() => {
529+
fixture = TestBed.createComponent(NzTestInputNumberStatusComponent);
530+
fixture.detectChanges();
531+
flush();
532+
fixture.detectChanges();
533+
testComponent = fixture.debugElement.componentInstance;
534+
535+
inputNumber = fixture.debugElement.query(By.directive(NzInputNumberComponent));
536+
}));
537+
it('should status work', () => {
538+
fixture.detectChanges();
539+
expect(inputNumber.nativeElement.className).toContain('ant-input-number-status-error');
540+
541+
testComponent.status = 'warning';
542+
fixture.detectChanges();
543+
expect(inputNumber.nativeElement.className).toContain('ant-input-number-status-warning');
544+
545+
testComponent.status = '';
546+
fixture.detectChanges();
547+
expect(inputNumber.nativeElement.className).not.toContain('ant-input-number-status-warning');
548+
});
549+
});
520550
});
521551

522552
@Component({
@@ -583,3 +613,10 @@ export class NzTestInputNumberFormComponent {
583613
this.formGroup.disable();
584614
}
585615
}
616+
617+
@Component({
618+
template: ` <nz-input-number [nzStatus]="status"></nz-input-number> `
619+
})
620+
export class NzTestInputNumberStatusComponent {
621+
status: NzStatus = 'error';
622+
}

0 commit comments

Comments
 (0)