Skip to content

Commit 6462a47

Browse files
authored
feat(module:datepicker): send event emitter when panel mode change (#8685)
1 parent 175f47b commit 6462a47

13 files changed

+227
-48
lines changed

components/date-picker/date-picker.component.spec.ts

+58-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { NzFormModule } from '../form';
2828
import en_US from '../i18n/languages/en_US';
2929
import { NzDatePickerComponent } from './date-picker.component';
3030
import { NzDatePickerModule } from './date-picker.module';
31+
import { NzPanelChangeType } from './standard-types';
3132
import { ENTER_EVENT, getPickerAbstract, getPickerInput } from './testing/util';
3233
import { PREFIX_CLASS } from './util';
3334

@@ -1129,6 +1130,7 @@ describe('NzDatePickerComponent', () => {
11291130
}));
11301131

11311132
it('should support nzOnPanelChange', fakeAsync(() => {
1133+
fixtureInstance.nzValue = new Date('2020-12-01');
11321134
spyOn(fixtureInstance, 'nzOnPanelChange');
11331135
fixture.detectChanges();
11341136
openPickerByClickTrigger();
@@ -1138,7 +1140,58 @@ describe('NzDatePickerComponent', () => {
11381140
fixture.detectChanges();
11391141
tick(500);
11401142
fixture.detectChanges();
1141-
expect(fixtureInstance.nzOnPanelChange).toHaveBeenCalledWith('month');
1143+
expect(fixtureInstance.nzOnPanelChange).toHaveBeenCalledWith({ mode: 'month', date: new Date('2020-12-01') });
1144+
}));
1145+
1146+
it('should support nzOnPanelChange when next button is clicked', fakeAsync(() => {
1147+
fixtureInstance.nzValue = new Date('2020-11-01');
1148+
spyOn(fixtureInstance, 'nzOnPanelChange');
1149+
fixture.detectChanges();
1150+
openPickerByClickTrigger();
1151+
dispatchMouseEvent(getNextBtn(), 'click');
1152+
fixture.detectChanges();
1153+
tick(500);
1154+
fixture.detectChanges();
1155+
expect(fixtureInstance.nzOnPanelChange).toHaveBeenCalledWith({ mode: 'date', date: new Date('2020-12-01') });
1156+
}));
1157+
it('should support nzOnPanelChange when super next button is clicked', fakeAsync(() => {
1158+
fixtureInstance.nzValue = new Date('2020-11-01');
1159+
spyOn(fixtureInstance, 'nzOnPanelChange');
1160+
fixture.detectChanges();
1161+
openPickerByClickTrigger();
1162+
dispatchMouseEvent(getSuperNextBtn(), 'click');
1163+
fixture.detectChanges();
1164+
tick(500);
1165+
fixture.detectChanges();
1166+
expect(fixtureInstance.nzOnPanelChange).toHaveBeenCalledWith({ mode: 'date', date: new Date('2021-11-01') });
1167+
}));
1168+
it('should support nzOnPanelChange when previous button is clicked', fakeAsync(() => {
1169+
fixtureInstance.nzValue = new Date('2020-11-01 11:22:33');
1170+
spyOn(fixtureInstance, 'nzOnPanelChange');
1171+
fixture.detectChanges();
1172+
openPickerByClickTrigger();
1173+
dispatchMouseEvent(getPreBtn(), 'click');
1174+
fixture.detectChanges();
1175+
tick(500);
1176+
fixture.detectChanges();
1177+
expect(fixtureInstance.nzOnPanelChange).toHaveBeenCalledWith({
1178+
mode: 'date',
1179+
date: new Date('2020-10-01 11:22:33')
1180+
});
1181+
}));
1182+
it('should support nzOnPanelChange when super previous button is clicked', fakeAsync(() => {
1183+
fixtureInstance.nzValue = new Date('2020-11-01 11:22:33');
1184+
spyOn(fixtureInstance, 'nzOnPanelChange');
1185+
fixture.detectChanges();
1186+
openPickerByClickTrigger();
1187+
dispatchMouseEvent(getSuperPreBtn(), 'click');
1188+
fixture.detectChanges();
1189+
tick(500);
1190+
fixture.detectChanges();
1191+
expect(fixtureInstance.nzOnPanelChange).toHaveBeenCalledWith({
1192+
mode: 'date',
1193+
date: new Date('2019-11-01 11:22:33')
1194+
});
11421195
}));
11431196

11441197
it('should support nzOnOk', fakeAsync(() => {
@@ -1487,7 +1540,9 @@ class NzTestDatePickerComponent {
14871540
nzSize!: string;
14881541

14891542
nzOnChange(_: Date | null): void {}
1543+
14901544
nzOnCalendarChange(): void {}
1545+
14911546
nzOnOpenChange(_: boolean): void {}
14921547

14931548
nzValue: Date | null = null;
@@ -1507,7 +1562,7 @@ class NzTestDatePickerComponent {
15071562
nzShowWeekNumber = false;
15081563

15091564
// nzRanges;
1510-
nzOnPanelChange(_: string): void {}
1565+
nzOnPanelChange(_: NzPanelChangeType): void {}
15111566

15121567
nzOnOk(_: Date): void {}
15131568

@@ -1547,5 +1602,6 @@ class NzTestDatePickerInFormComponent {
15471602
validateForm = this.fb.group({
15481603
demo: this.fb.control<Date | null>(null, Validators.required)
15491604
});
1605+
15501606
constructor(private fb: FormBuilder) {}
15511607
}

components/date-picker/date-picker.component.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ import { Platform } from '@angular/cdk/platform';
1717
import { DOCUMENT, NgStyle, NgTemplateOutlet } from '@angular/common';
1818
import {
1919
AfterViewInit,
20+
booleanAttribute,
2021
ChangeDetectionStrategy,
2122
ChangeDetectorRef,
2223
Component,
2324
ElementRef,
2425
EventEmitter,
26+
forwardRef,
27+
inject,
2528
Input,
2629
NgZone,
2730
OnChanges,
@@ -33,10 +36,7 @@ import {
3336
TemplateRef,
3437
ViewChild,
3538
ViewChildren,
36-
ViewEncapsulation,
37-
booleanAttribute,
38-
forwardRef,
39-
inject
39+
ViewEncapsulation
4040
} from '@angular/core';
4141
import { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
4242
import { fromEvent, of as observableOf } from 'rxjs';
@@ -50,7 +50,7 @@ import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation';
5050
import { NzOutletModule } from 'ng-zorro-antd/core/outlet';
5151
import { DATE_PICKER_POSITION_MAP, DEFAULT_DATE_PICKER_POSITIONS, NzOverlayModule } from 'ng-zorro-antd/core/overlay';
5252
import { NzDestroyService } from 'ng-zorro-antd/core/services';
53-
import { CandyDate, CompatibleValue, cloneDate, wrongSortOrder } from 'ng-zorro-antd/core/time';
53+
import { CandyDate, cloneDate, CompatibleValue, wrongSortOrder } from 'ng-zorro-antd/core/time';
5454
import {
5555
BooleanInput,
5656
FunctionProp,
@@ -76,6 +76,7 @@ import {
7676
CompatibleDate,
7777
DisabledTimeFn,
7878
NzDateMode,
79+
NzPanelChangeType,
7980
PresetRanges,
8081
RangePartType,
8182
SupportTimeOptions
@@ -323,8 +324,7 @@ export class NzDatePickerComponent implements OnInit, OnChanges, AfterViewInit,
323324
@Input() nzPlacement: NzPlacement = 'bottomLeft';
324325
@Input({ transform: booleanAttribute }) nzShowWeekNumber: boolean = false;
325326

326-
// TODO(@wenqi73) The PanelMode need named for each pickers and export
327-
@Output() readonly nzOnPanelChange = new EventEmitter<NzDateMode | NzDateMode[] | string | string[]>();
327+
@Output() readonly nzOnPanelChange = new EventEmitter<NzPanelChangeType>();
328328
@Output() readonly nzOnCalendarChange = new EventEmitter<Array<Date | null>>();
329329
@Output() readonly nzOnOk = new EventEmitter<CompatibleDate | null>();
330330
@Output() readonly nzOnOpenChange = new EventEmitter<boolean>();
@@ -868,8 +868,8 @@ export class NzDatePickerComponent implements OnInit, OnChanges, AfterViewInit,
868868
}
869869
}
870870

871-
onPanelModeChange(panelMode: NzDateMode | NzDateMode[]): void {
872-
this.nzOnPanelChange.emit(panelMode);
871+
onPanelModeChange(panelChange: NzPanelChangeType): void {
872+
this.nzOnPanelChange.emit(panelChange);
873873
}
874874

875875
// Emit nzOnCalendarChange when select date by nz-range-picker

components/date-picker/date-range-popup.component.ts

+12-7
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import {
4545
DisabledTimeFn,
4646
DisabledTimePartial,
4747
NzDateMode,
48+
NzPanelChangeType,
4849
PresetRanges,
4950
RangePartType,
5051
SupportTimeOptions
@@ -98,7 +99,7 @@ import { getTimeConfig, isAllowedDate, PREFIX_CLASS } from './util';
9899
[showTimePicker]="hasTimePicker"
99100
[timeOptions]="getTimeOptions(partType)"
100101
[panelMode]="getPanelMode(panelMode, partType)"
101-
(panelModeChange)="onPanelModeChange($event, partType)"
102+
(panelChange)="onPanelModeChange($event, partType)"
102103
[activeDate]="getActiveDate(partType)"
103104
[value]="getValue(partType)"
104105
[disabledDate]="disabledDate"
@@ -164,7 +165,7 @@ export class DateRangePopupComponent implements OnInit, OnChanges, OnDestroy {
164165
@Input() defaultPickerValue!: CompatibleDate | undefined | null;
165166
@Input() dir: Direction = 'ltr';
166167

167-
@Output() readonly panelModeChange = new EventEmitter<NzDateMode | NzDateMode[]>();
168+
@Output() readonly panelModeChange = new EventEmitter<NzPanelChangeType>();
168169
@Output() readonly calendarChange = new EventEmitter<CompatibleValue>();
169170
@Output() readonly resultOk = new EventEmitter<void>(); // Emitted when done with date selecting
170171

@@ -270,18 +271,22 @@ export class DateRangePopupComponent implements OnInit, OnChanges, OnDestroy {
270271
}
271272
}
272273

273-
onPanelModeChange(mode: NzDateMode, partType?: RangePartType): void {
274+
onPanelModeChange(panelChangeEvent: NzPanelChangeType, partType?: RangePartType): void {
274275
if (this.isRange) {
275276
const index = this.datePickerService.getActiveIndex(partType);
276277
if (index === 0) {
277-
this.panelMode = [mode, this.panelMode[1]] as NzDateMode[];
278+
this.panelMode = [panelChangeEvent.mode, this.panelMode[1]] as [NzDateMode, NzDateMode];
278279
} else {
279-
this.panelMode = [this.panelMode[0], mode] as NzDateMode[];
280+
this.panelMode = [this.panelMode[0], panelChangeEvent.mode] as [NzDateMode, NzDateMode];
280281
}
282+
this.panelModeChange.emit({
283+
mode: this.panelMode as [NzDateMode, NzDateMode],
284+
date: (this.datePickerService.activeDate as SingleValue[]).map(d => d!.nativeDate) as [Date, Date]
285+
});
281286
} else {
282-
this.panelMode = mode;
287+
this.panelMode = panelChangeEvent.mode as NzDateMode;
288+
this.panelModeChange.emit({ mode: this.panelMode as NzDateMode, date: panelChangeEvent.date as Date });
283289
}
284-
this.panelModeChange.emit(this.panelMode);
285290
}
286291

287292
onActiveDateChange(value: CandyDate, partType: RangePartType): void {

components/date-picker/doc/index.en-US.md

+6-3
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ provided in the file of `app.module.ts`.
2323
For example:
2424

2525
```typescript
26-
import {registerLocaleData} from '@angular/common';
26+
import { registerLocaleData } from '@angular/common';
2727
import en from '@angular/common/locales/en';
28+
2829
registerLocaleData(en);
2930
```
3031

@@ -60,6 +61,7 @@ The following APIs are shared by nz-date-picker, nz-range-picker.
6061
| `[nzBorderless]` | remove the border | `boolean` | `false` | - |
6162
| `[nzInline]` | inline mode | `boolean` | `false` | - |
6263
| `(nzOnOpenChange)` | a callback emitter, can be executed whether the popup calendar is popped up or closed | `EventEmitter<boolean>` | - | - |
64+
| `(nzOnPanelChange)` | a callback emitter, can be executed when the panel changes | `EventEmitter<NzPanelChangeType>` | - | - |
6365

6466
### Common Methods
6567

@@ -104,8 +106,9 @@ The following APIs are shared by nz-date-picker, nz-range-picker.
104106
| `[nzShowWeekNumber]` | whether to show the week number on each row (Only supported by date picker. Week picker always shows week numbers) | `boolean` | `false` |
105107
| `(nzOnOk)` | click ok callback | `EventEmitter<Date[]>` | - |
106108

107-
> Currently, supported `nz-time-picker` parameters in `nzShowTime`
108-
> are: `nzFormat`, `nzHourStep`, `nzMinuteStep`, `nzSecondStep`, `nzDisabledHours`, `nzDisabledMinutes`, `nzDisabledSeconds`, `nzHideDisabledOptions`, `nzDefaultOpenValue`, `nzAddOn`
109+
> Currently, supported `nz-time-picker` parameters in `nzShowTime` are: `nzFormat`, `nzHourStep`, `nzMinuteStep`,
110+
`nzSecondStep`, `nzDisabledHours`, `nzDisabledMinutes`, `nzDisabledSeconds`, `nzHideDisabledOptions`,
111+
`nzDefaultOpenValue`, `nzAddOn`
109112

110113
## FAQ
111114

components/date-picker/inner-popup.component.ts

+12-12
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
import {
7+
booleanAttribute,
78
ChangeDetectionStrategy,
89
Component,
910
EventEmitter,
@@ -12,8 +13,7 @@ import {
1213
Output,
1314
SimpleChanges,
1415
TemplateRef,
15-
ViewEncapsulation,
16-
booleanAttribute
16+
ViewEncapsulation
1717
} from '@angular/core';
1818
import { FormsModule } from '@angular/forms';
1919

@@ -23,7 +23,7 @@ import { NzCalendarI18nInterface } from 'ng-zorro-antd/i18n';
2323
import { NzTimePickerModule } from 'ng-zorro-antd/time-picker';
2424

2525
import { LibPackerModule } from './lib';
26-
import { DisabledDateFn, NzDateMode, RangePartType, SupportTimeOptions } from './standard-types';
26+
import { DisabledDateFn, NzDateMode, NzPanelChangeType, RangePartType, SupportTimeOptions } from './standard-types';
2727
import { PREFIX_CLASS } from './util';
2828

2929
@Component({
@@ -44,7 +44,7 @@ import { PREFIX_CLASS } from './util';
4444
[showSuperNextBtn]="enablePrevNext('next', 'decade')"
4545
[showNextBtn]="false"
4646
[showPreBtn]="false"
47-
(panelModeChange)="panelModeChange.emit($event)"
47+
(panelChange)="panelChange.emit($event)"
4848
(valueChange)="headerChange.emit($event)"
4949
/>
5050
<div class="{{ prefixCls }}-body">
@@ -65,7 +65,7 @@ import { PREFIX_CLASS } from './util';
6565
[showSuperNextBtn]="enablePrevNext('next', 'year')"
6666
[showNextBtn]="false"
6767
[showPreBtn]="false"
68-
(panelModeChange)="panelModeChange.emit($event)"
68+
(panelChange)="panelChange.emit($event)"
6969
(valueChange)="headerChange.emit($event)"
7070
/>
7171
<div class="{{ prefixCls }}-body">
@@ -89,7 +89,7 @@ import { PREFIX_CLASS } from './util';
8989
[showSuperNextBtn]="enablePrevNext('next', 'month')"
9090
[showNextBtn]="false"
9191
[showPreBtn]="false"
92-
(panelModeChange)="panelModeChange.emit($event)"
92+
(panelChange)="panelChange.emit($event)"
9393
(valueChange)="headerChange.emit($event)"
9494
/>
9595
<div class="{{ prefixCls }}-body">
@@ -113,7 +113,7 @@ import { PREFIX_CLASS } from './util';
113113
[showSuperNextBtn]="enablePrevNext('next', 'month')"
114114
[showNextBtn]="false"
115115
[showPreBtn]="false"
116-
(panelModeChange)="panelModeChange.emit($event)"
116+
(panelChange)="panelChange.emit($event)"
117117
(valueChange)="headerChange.emit($event)"
118118
/>
119119
<div class="{{ prefixCls }}-body">
@@ -140,7 +140,7 @@ import { PREFIX_CLASS } from './util';
140140
"
141141
[showPreBtn]="panelMode === 'week' ? enablePrevNext('prev', 'week') : enablePrevNext('prev', 'date')"
142142
[showNextBtn]="panelMode === 'week' ? enablePrevNext('next', 'week') : enablePrevNext('next', 'date')"
143-
(panelModeChange)="panelModeChange.emit($event)"
143+
(panelChange)="panelChange.emit($event)"
144144
(valueChange)="headerChange.emit($event)"
145145
/>
146146
<div class="{{ prefixCls }}-body">
@@ -199,7 +199,7 @@ export class InnerPopupComponent implements OnChanges {
199199
@Input() value!: CandyDate;
200200
@Input() partType!: RangePartType;
201201

202-
@Output() readonly panelModeChange = new EventEmitter<NzDateMode>();
202+
@Output() readonly panelChange = new EventEmitter<NzPanelChangeType>();
203203
// TODO: name is not proper
204204
@Output() readonly headerChange = new EventEmitter<CandyDate>(); // Emitted when user changed the header's value
205205
@Output() readonly selectDate = new EventEmitter<CandyDate>(); // Emitted when the date is selected by click the date panel
@@ -247,7 +247,7 @@ export class InnerPopupComponent implements OnChanges {
247247
this.selectDate.emit(value);
248248
} else {
249249
this.headerChange.emit(value);
250-
this.panelModeChange.emit(this.endPanelMode);
250+
this.panelChange.emit({ mode: this.endPanelMode, date: value.nativeDate });
251251
}
252252
}
253253

@@ -264,7 +264,7 @@ export class InnerPopupComponent implements OnChanges {
264264
this.selectDate.emit(value);
265265
} else {
266266
this.headerChange.emit(value);
267-
this.panelModeChange.emit(this.endPanelMode);
267+
this.panelChange.emit({ mode: this.endPanelMode, date: value.nativeDate });
268268
}
269269
}
270270

@@ -275,7 +275,7 @@ export class InnerPopupComponent implements OnChanges {
275275
this.selectDate.emit(value);
276276
} else {
277277
this.headerChange.emit(value);
278-
this.panelModeChange.emit('year');
278+
this.panelChange.emit({ mode: 'year', date: value.nativeDate });
279279
}
280280
}
281281

0 commit comments

Comments
 (0)