Skip to content

Commit 9b98fe1

Browse files
authored
feat(module:transfer): support setting status (#7475)
* feat(module:transfer): support setting status * feat(module:transfer): add tests
1 parent ac38b2d commit 9b98fe1

File tree

7 files changed

+102
-8
lines changed

7 files changed

+102
-8
lines changed

components/transfer/demo/module

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { NzIconModule } from 'ng-zorro-antd/icon';
55
import { NzTableModule } from 'ng-zorro-antd/table';
66
import { NzTagModule } from 'ng-zorro-antd/tag';
77
import { NzTreeModule } from 'ng-zorro-antd/tree';
8+
import { NzSpaceModule } from 'ng-zorro-antd/space';
89

910
export const moduleList = [
1011
NzTransferModule,
@@ -13,5 +14,6 @@ export const moduleList = [
1314
NzIconModule,
1415
NzTableModule,
1516
NzTagModule,
16-
NzTreeModule
17+
NzTreeModule,
18+
NzSpaceModule
1719
];

components/transfer/demo/status.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
order: 7
3+
title:
4+
zh-CN: 自定义状态
5+
en-US: Status
6+
---
7+
8+
## zh-CN
9+
10+
使用 `nzStatus` 为 Transfer 添加状态,可选 `error` 或者 `warning`
11+
12+
## en-US
13+
14+
Add status to Transfer with `nzStatus`, which could be `error` or `warning`.

components/transfer/demo/status.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Component } from '@angular/core';
2+
3+
@Component({
4+
selector: 'nz-demo-transfer-status',
5+
template: `
6+
<nz-space nzDirection="vertical">
7+
<nz-transfer *nzSpaceItem [nzDataSource]="[]" nzStatus="error"></nz-transfer>
8+
<nz-transfer *nzSpaceItem [nzDataSource]="[]" nzStatus="warning" nzShowSearch></nz-transfer>
9+
</nz-space>
10+
`
11+
})
12+
export class NzDemoTransferStatusComponent {}

components/transfer/doc/index.en-US.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import { NzTransferModule } from 'ng-zorro-antd/transfer';
4141
| `[nzCanMove]` | A function to determine what items should be moved (by default all checked items are moved). please refer to the case. | `(arg: TransferCanMove) => Observable<TransferItem[]>` | - |
4242
| `[nzSelectedKeys]` | A set of keys of selected items. | `string[]` | - |
4343
| `[nzTargetKeys]` | A set of keys of elements that are listed on the right column. | `string[]` | - |
44+
| `[nzStatus]` | Set validation status | `'error' \| 'warning'` | - |
4445
| `(nzChange)` | A callback function that is executed when the transfer between columns is complete. | `EventEmitter<TransferChange>` | - |
4546
| `(nzSearchChange)` | A callback function which is executed when search field are changed | `EventEmitter<TransferSearchChange>` | - |
4647
| `(nzSelectChange)` | A callback function which is executed when selected items are changed. | `EventEmitter<TransferSearchChange>` | - |

components/transfer/doc/index.zh-CN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import { NzTransferModule } from 'ng-zorro-antd/transfer';
4343
| `[nzCanMove]` | 穿梭时二次校验。**注意:** 穿梭组件内部始终只保留一份数据,二次校验过程中需取消穿梭项则直接删除该项;具体用法见示例。 | `(arg: TransferCanMove) => Observable<TransferItem[]>` | - |
4444
| `[nzSelectedKeys]` | 设置被选中的 key 集合 | `string[]` | - |
4545
| `[nzTargetKeys]` | 显示在右侧框数据的 key 集合 | `string[]` | - |
46+
| `[nzStatus]` | 设置校验状态 | `'error' \| 'warning'` | - |
4647
| `(nzChange)` | 选项在两栏之间转移时的回调函数 | `EventEmitter<TransferChange>` | - |
4748
| `(nzSearchChange)` | 搜索框内容时改变时的回调函数 | `EventEmitter<TransferSearchChange>` | - |
4849
| `(nzSelectChange)` | 选中项发生改变时的回调函数 | `EventEmitter<TransferSearchChange>` | - |

components/transfer/transfer.component.ts

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
ChangeDetectionStrategy,
99
ChangeDetectorRef,
1010
Component,
11+
ElementRef,
1112
EventEmitter,
1213
Input,
1314
OnChanges,
@@ -16,6 +17,7 @@ import {
1617
Optional,
1718
Output,
1819
QueryList,
20+
Renderer2,
1921
SimpleChanges,
2022
TemplateRef,
2123
ViewChildren,
@@ -24,8 +26,8 @@ import {
2426
import { Observable, of, Subject } from 'rxjs';
2527
import { takeUntil } from 'rxjs/operators';
2628

27-
import { BooleanInput, NgStyleInterface, NzSafeAny } from 'ng-zorro-antd/core/types';
28-
import { InputBoolean, toArray } from 'ng-zorro-antd/core/util';
29+
import { BooleanInput, NgClassInterface, NgStyleInterface, NzSafeAny, NzStatus } from 'ng-zorro-antd/core/types';
30+
import { getStatusClassNames, InputBoolean, toArray } from 'ng-zorro-antd/core/util';
2931
import { NzI18nService, NzTransferI18nInterface } from 'ng-zorro-antd/i18n';
3032

3133
import {
@@ -161,6 +163,11 @@ export class NzTransferComponent implements OnInit, OnChanges, OnDestroy {
161163
rightFilter = '';
162164
dir: Direction = 'ltr';
163165

166+
// status
167+
prefixCls: string = 'ant-transfer';
168+
statusCls: NgClassInterface = {};
169+
hasFeedback: boolean = false;
170+
164171
// #region fields
165172

166173
@Input() @InputBoolean() nzDisabled = false;
@@ -181,6 +188,7 @@ export class NzTransferComponent implements OnInit, OnChanges, OnDestroy {
181188
@Input() nzNotFoundContent?: string;
182189
@Input() nzTargetKeys: string[] = [];
183190
@Input() nzSelectedKeys: string[] = [];
191+
@Input() nzStatus?: NzStatus;
184192

185193
// events
186194
@Output() readonly nzChange = new EventEmitter<TransferChange>();
@@ -286,6 +294,8 @@ export class NzTransferComponent implements OnInit, OnChanges, OnDestroy {
286294
constructor(
287295
private cdr: ChangeDetectorRef,
288296
private i18n: NzI18nService,
297+
private elementRef: ElementRef<HTMLElement>,
298+
private renderer: Renderer2,
289299
@Optional() private directionality: Directionality
290300
) {}
291301

@@ -333,23 +343,39 @@ export class NzTransferComponent implements OnInit, OnChanges, OnDestroy {
333343
}
334344

335345
ngOnChanges(changes: SimpleChanges): void {
336-
if (changes.nzDataSource) {
346+
const { nzStatus, nzDataSource, nzTargetKeys, nzSelectedKeys } = changes;
347+
if (nzDataSource) {
337348
this.splitDataSource();
338349
this.updateOperationStatus('left');
339350
this.updateOperationStatus('right');
340351
this.cdr.detectChanges();
341352
this.markForCheckAllList();
342353
}
343-
if (changes.nzTargetKeys) {
354+
if (nzTargetKeys) {
344355
this.handleNzTargetKeys();
345356
}
346-
if (changes.nzSelectedKeys) {
357+
if (nzSelectedKeys) {
347358
this.handleNzSelectedKeys();
348359
}
360+
if (nzStatus) {
361+
this.setStatusStyles();
362+
}
349363
}
350364

351365
ngOnDestroy(): void {
352366
this.unsubscribe$.next();
353367
this.unsubscribe$.complete();
354368
}
369+
370+
private setStatusStyles(): void {
371+
// render status if nzStatus is set
372+
this.statusCls = getStatusClassNames(this.prefixCls, this.nzStatus, this.hasFeedback);
373+
Object.keys(this.statusCls).forEach(status => {
374+
if (this.statusCls[status]) {
375+
this.renderer.addClass(this.elementRef.nativeElement, status);
376+
} else {
377+
this.renderer.removeClass(this.elementRef.nativeElement, status);
378+
}
379+
});
380+
}
355381
}

components/transfer/transfer.spec.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
1616
import { Observable, of } from 'rxjs';
1717
import { map } from 'rxjs/operators';
1818

19+
import { NzStatus } from 'ng-zorro-antd/core/types';
1920
import { NzIconTestModule } from 'ng-zorro-antd/icon/testing';
2021

2122
import en_US from '../i18n/languages/en_US';
@@ -30,7 +31,11 @@ const DISABLED = 1;
3031
describe('transfer', () => {
3132
let injector: Injector;
3233
let fixture: ComponentFixture<
33-
TestTransferComponent | TestTransferCustomRenderComponent | Test996Component | NzTestTransferRtlComponent
34+
| TestTransferComponent
35+
| TestTransferCustomRenderComponent
36+
| Test996Component
37+
| NzTestTransferRtlComponent
38+
| NzTestTransferStatusComponent
3439
>;
3540
let dl: DebugElement;
3641
let instance: TestTransferComponent;
@@ -42,7 +47,8 @@ describe('transfer', () => {
4247
TestTransferComponent,
4348
TestTransferCustomRenderComponent,
4449
Test996Component,
45-
NzTestTransferRtlComponent
50+
NzTestTransferRtlComponent,
51+
NzTestTransferStatusComponent
4652
]
4753
});
4854
fixture = TestBed.createComponent(TestTransferComponent);
@@ -374,6 +380,31 @@ describe('transfer', () => {
374380
}));
375381
});
376382

383+
describe('transfer status', () => {
384+
let componentElement: HTMLElement;
385+
let testComponent: NzTestTransferStatusComponent;
386+
387+
beforeEach(() => {
388+
fixture = TestBed.createComponent(NzTestTransferStatusComponent);
389+
componentElement = fixture.debugElement.query(By.directive(NzTransferComponent)).nativeElement;
390+
fixture.detectChanges();
391+
testComponent = fixture.debugElement.componentInstance;
392+
});
393+
394+
it('should className correct with nzStatus', () => {
395+
fixture.detectChanges();
396+
expect(componentElement.className).toContain('ant-transfer-status-error');
397+
398+
testComponent.status = 'warning';
399+
fixture.detectChanges();
400+
expect(componentElement.className).toContain('ant-transfer-status-warning');
401+
402+
testComponent.status = '';
403+
fixture.detectChanges();
404+
expect(componentElement.className).not.toContain('ant-transfer-status-warning');
405+
});
406+
});
407+
377408
class TransferPageObject {
378409
[key: string]: any;
379410

@@ -610,3 +641,10 @@ export class NzTestTransferRtlComponent {
610641
@ViewChild(Dir) dir!: Dir;
611642
direction = 'rtl';
612643
}
644+
645+
@Component({
646+
template: ` <nz-transfer [nzDataSource]="[]" [nzStatus]="status"></nz-transfer> `
647+
})
648+
export class NzTestTransferStatusComponent {
649+
status: NzStatus = 'error';
650+
}

0 commit comments

Comments
 (0)