Skip to content

Commit bc5a0cd

Browse files
fix(IgxTimePicker): determine initial min-max value #6494
1 parent 223df3d commit bc5a0cd

File tree

3 files changed

+57
-32
lines changed

3 files changed

+57
-32
lines changed

projects/igniteui-angular/src/lib/time-picker/time-picker.component.spec.ts

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,28 @@ describe('IgxTimePicker', () => {
198198
expect(timePicker.onValidationFailed.emit).toHaveBeenCalled();
199199
}));
200200

201+
it('Should not throw Validation Failed event with null value passed in', fakeAsync(() => {
202+
const fixture = TestBed.createComponent(IgxTimePickerWithPmTimeComponent);
203+
fixture.componentInstance.dateValue = null;
204+
fixture.detectChanges();
205+
206+
const timePicker = fixture.componentInstance.timePicker;
207+
const dom = fixture.debugElement;
208+
const timePickerTarget = dom.query(By.directive(IgxInputDirective));
209+
spyOn(timePicker.onValidationFailed, 'emit');
210+
211+
UIInteractions.clickElement(timePickerTarget);
212+
tick();
213+
fixture.detectChanges();
214+
215+
const cancelButton = dom.query(By.css('.igx-button--flat'));
216+
UIInteractions.clickElement(cancelButton);
217+
tick();
218+
fixture.detectChanges();
219+
220+
expect(timePicker.onValidationFailed.emit).not.toHaveBeenCalled();
221+
}));
222+
201223
it('TimePicker cancel button', fakeAsync(() => {
202224
const fixture = TestBed.createComponent(IgxTimePickerWithPmTimeComponent);
203225
fixture.detectChanges();
@@ -1542,34 +1564,34 @@ describe('IgxTimePicker', () => {
15421564
}));
15431565

15441566
it('When timepicker is closed via outside click, the focus should NOT remain on the input',
1545-
fakeAsync(() => {
1546-
fixture.detectChanges();
1547-
input = fixture.debugElement.query(By.directive(IgxInputDirective)).nativeElement;
1548-
let overlayToggle = document.getElementsByClassName('igx-overlay__wrapper');
1567+
fakeAsync(() => {
1568+
fixture.detectChanges();
1569+
input = fixture.debugElement.query(By.directive(IgxInputDirective)).nativeElement;
1570+
let overlayToggle = document.getElementsByClassName('igx-overlay__wrapper');
15491571

1550-
expect(overlayToggle.length).toEqual(0);
1572+
expect(overlayToggle.length).toEqual(0);
15511573

1552-
const iconTime = dom.queryAll(By.css('.igx-icon'))[0];
1553-
UIInteractions.clickElement(iconTime);
1554-
tick();
1555-
fixture.detectChanges();
1574+
const iconTime = dom.queryAll(By.css('.igx-icon'))[0];
1575+
UIInteractions.clickElement(iconTime);
1576+
tick();
1577+
fixture.detectChanges();
15561578

1557-
overlayToggle = document.getElementsByClassName('igx-overlay__wrapper');
1558-
expect(overlayToggle[0]).not.toBeNull();
1559-
expect(overlayToggle[0]).not.toBeUndefined();
1579+
overlayToggle = document.getElementsByClassName('igx-overlay__wrapper');
1580+
expect(overlayToggle[0]).not.toBeNull();
1581+
expect(overlayToggle[0]).not.toBeUndefined();
15601582

1561-
const dummyInput = fixture.componentInstance.dummyInput.nativeElement;
1562-
dummyInput.focus();
1563-
dummyInput.click();
1564-
tick();
1565-
fixture.detectChanges();
1583+
const dummyInput = fixture.componentInstance.dummyInput.nativeElement;
1584+
dummyInput.focus();
1585+
dummyInput.click();
1586+
tick();
1587+
fixture.detectChanges();
15661588

1567-
overlayToggle = document.getElementsByClassName('igx-overlay__wrapper');
1568-
input = fixture.debugElement.query(By.directive(IgxInputDirective)).nativeElement;
1569-
expect(overlayToggle[0]).toEqual(undefined);
1570-
expect(input).not.toEqual(document.activeElement);
1571-
expect(dummyInput).toEqual(document.activeElement);
1572-
}));
1589+
overlayToggle = document.getElementsByClassName('igx-overlay__wrapper');
1590+
input = fixture.debugElement.query(By.directive(IgxInputDirective)).nativeElement;
1591+
expect(overlayToggle[0]).toEqual(undefined);
1592+
expect(input).not.toEqual(document.activeElement);
1593+
expect(dummyInput).toEqual(document.activeElement);
1594+
}));
15731595
});
15741596

15751597
describe('Timepicker with outlet', () => {

projects/igniteui-angular/src/lib/time-picker/time-picker.component.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,7 +1112,7 @@ export class IgxTimePickerComponent implements
11121112
}
11131113

11141114
private _convertMinMaxValue(value: string): Date {
1115-
const date = this.value ? new Date(this.value) : this._dateFromModel ? new Date(this._dateFromModel) : new Date();
1115+
const date = this._dateFromModel ? new Date(this._dateFromModel) : this.value ? new Date(this.value) : new Date();
11161116
const sections = value.split(/[\s:]+/);
11171117
let hour, minutes, amPM;
11181118

@@ -1153,9 +1153,9 @@ export class IgxTimePickerComponent implements
11531153
return false;
11541154
} else if (this.minValue && value < this._convertMinMaxValue(this.minValue)) {
11551155
return false;
1156-
} else {
1157-
return true;
11581156
}
1157+
1158+
return true;
11591159
}
11601160

11611161
private _isEntryValid(val: string): boolean {
@@ -1294,6 +1294,10 @@ export class IgxTimePickerComponent implements
12941294
const oldValue = this.value;
12951295
const newVal = this._convertMinMaxValue(this.displayValue);
12961296

1297+
if (!this.displayValue && this.displayValue === this._formatTime(this.value, this.format)) {
1298+
return;
1299+
}
1300+
12971301
if (this._isValueValid(newVal)) {
12981302
if (!this.value || oldValue.getTime() !== newVal.getTime()) {
12991303
this.value = newVal;
@@ -1331,7 +1335,6 @@ export class IgxTimePickerComponent implements
13311335
// use this flag to make sure that min/maxValue are checked (in _convertMinMaxValue() method)
13321336
// against the real value when initializing the component and value is bound via ngModel
13331337
this._dateFromModel = value;
1334-
13351338
this.value = value;
13361339

13371340
if (this.mode === InteractionMode.DropDown) {
@@ -1563,7 +1566,7 @@ export class IgxTimePickerComponent implements
15631566
* ```
15641567
*/
15651568
public cancelButtonClick(): void {
1566-
if (this.mode === InteractionMode.DropDown) {
1569+
if (this.mode === InteractionMode.DropDown && this.value) {
15671570
this.displayValue = this._formatTime(this.value, this.format);
15681571
}
15691572

@@ -1795,8 +1798,8 @@ export class IgxTimePickerComponent implements
17951798
}
17961799

17971800
// minor hack for preventing cursor jumping in IE
1798-
this._displayValue = this.inputFormat.transform(displayVal);
1799-
this.input.nativeElement.value = this._displayValue;
1801+
this.displayValue = this.inputFormat.transform(displayVal);
1802+
this.input.nativeElement.value = this.displayValue;
18001803
this._setCursorPosition(cursor);
18011804

18021805
requestAnimationFrame(() => {

src/app/time-picker/time-picker.sample.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ export class TimePickerSampleComponent implements AfterViewInit {
1717
mode = InteractionMode.DropDown;
1818

1919
date1 = new Date(2018, 10, 27, 17, 45, 0, 0);
20-
date = new Date(2018, 10, 27, 17, 45, 0, 0);
21-
val = new Date(0, 0, 0, 19, 35, 0, 0);
20+
date = new Date(2018, 10, 27, 21, 55, 0, 0);
21+
val = new Date(0, 0, 0, 19, 35, 30, 0);
2222
today = new Date(Date.now());
2323

2424
isRequired = true;

0 commit comments

Comments
 (0)