Skip to content

Commit

Permalink
feat(datepicker): close calendar after choose the same date again (#6323
Browse files Browse the repository at this point in the history
)

* feat: close calendar after choose the same date again

* feat: close calendar by userSelection event

* addressing pr comments

* fix for tslint errors

* addressing pr comments
  • Loading branch information
hwesol13 authored and andrewseguin committed Aug 15, 2017
1 parent 66b1ff5 commit 9ba5d84
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 14 deletions.
3 changes: 2 additions & 1 deletion src/lib/datepicker/calendar.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@
[activeDate]="_activeDate"
[selected]="selected"
[dateFilter]="_dateFilterForViews"
(selectedChange)="_dateSelected($event)">
(selectedChange)="_dateSelected($event)"
(userSelection)="_userSelected()">
</md-month-view>

<md-year-view
Expand Down
7 changes: 7 additions & 0 deletions src/lib/datepicker/calendar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ export class MdCalendar<D> implements AfterContentInit, OnDestroy {
/** Emits when the currently selected date changes. */
@Output() selectedChange = new EventEmitter<D>();

/** Emits when any date is selected. */
@Output() userSelection = new EventEmitter<void>();

/** Date filter for the month and year views. */
_dateFilterForViews = (date: D) => {
return !!date &&
Expand Down Expand Up @@ -159,6 +162,10 @@ export class MdCalendar<D> implements AfterContentInit, OnDestroy {
}
}

_userSelected(): void {
this.userSelection.emit();
}

/** Handles month selection in the year view. */
_monthSelected(month: D): void {
this._activeDate = month;
Expand Down
3 changes: 2 additions & 1 deletion src/lib/datepicker/datepicker-content.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@
[maxDate]="datepicker._maxDate"
[dateFilter]="datepicker._dateFilter"
[selected]="datepicker._selected"
(selectedChange)="datepicker._selectAndClose($event)">
(selectedChange)="datepicker._select($event)"
(userSelection)="datepicker.close()">
</md-calendar>
32 changes: 28 additions & 4 deletions src/lib/datepicker/datepicker.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,30 @@ describe('MdDatepicker', () => {
});
});

it('clicking the currently selected date should close the calendar ' +
'without firing selectedChanged', () => {
const selectedChangedSpy =
spyOn(testComponent.datepicker.selectedChanged, 'emit').and.callThrough();
for (let changeCount = 1; changeCount < 3; changeCount++) {
const currentDay = changeCount;
testComponent.datepicker.open();
fixture.detectChanges();

expect(document.querySelector('md-datepicker-content')).not.toBeNull();
expect(testComponent.datepickerInput.value).toEqual(new Date(2020, JAN, currentDay));

let cells = document.querySelectorAll('.mat-calendar-body-cell');
dispatchMouseEvent(cells[1], 'click');
fixture.detectChanges();
}

fixture.whenStable().then(() => {
expect(selectedChangedSpy.calls.count()).toEqual(1);
expect(document.querySelector('md-dialog-container')).toBeNull();
expect(testComponent.datepickerInput.value).toEqual(new Date(2020, JAN, 2));
});
});

it('startAt should fallback to input value', () => {
expect(testComponent.datepicker.startAt).toEqual(new Date(2020, JAN, 1));
});
Expand Down Expand Up @@ -361,7 +385,7 @@ describe('MdDatepicker', () => {
expect(testComponent.datepickerInput.value).toBeNull();

let selected = new Date(2017, JAN, 1);
testComponent.datepicker._selectAndClose(selected);
testComponent.datepicker._select(selected);
fixture.detectChanges();

fixture.whenStable().then(() => {
Expand All @@ -388,7 +412,7 @@ describe('MdDatepicker', () => {

expect(inputEl.classList).toContain('ng-pristine');

testComponent.datepicker._selectAndClose(new Date(2017, JAN, 1));
testComponent.datepicker._select(new Date(2017, JAN, 1));
fixture.detectChanges();

fixture.whenStable().then(() => {
Expand Down Expand Up @@ -434,7 +458,7 @@ describe('MdDatepicker', () => {

expect(inputEl.classList).toContain('ng-untouched');

testComponent.datepicker._selectAndClose(new Date(2017, JAN, 1));
testComponent.datepicker._select(new Date(2017, JAN, 1));
fixture.detectChanges();

fixture.whenStable().then(() => {
Expand Down Expand Up @@ -478,7 +502,7 @@ describe('MdDatepicker', () => {
expect(testComponent.datepickerInput.value).toBeNull();

let selected = new Date(2017, JAN, 1);
testComponent.datepicker._selectAndClose(selected);
testComponent.datepicker._select(selected);
fixture.detectChanges();

expect(testComponent.formControl.value).toEqual(selected);
Expand Down
5 changes: 2 additions & 3 deletions src/lib/datepicker/datepicker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -224,14 +224,13 @@ export class MdDatepicker<D> implements OnDestroy {
}
}

/** Selects the given date and closes the currently open popup or dialog. */
_selectAndClose(date: D): void {
/** Selects the given date */
_select(date: D): void {
let oldValue = this._selected;
this._selected = date;
if (!this._dateAdapter.sameDate(oldValue, this._selected)) {
this.selectedChanged.emit(date);
}
this.close();
}

/**
Expand Down
16 changes: 11 additions & 5 deletions src/lib/datepicker/month-view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ export class MdMonthView<D> implements AfterContentInit {
/** Emits when a new date is selected. */
@Output() selectedChange = new EventEmitter<D | null>();

/** Emits when any date is selected. */
@Output() userSelection = new EventEmitter<void>();

/** The label for this month (e.g. "January 2017"). */
_monthLabel: string;

Expand Down Expand Up @@ -116,12 +119,15 @@ export class MdMonthView<D> implements AfterContentInit {

/** Handles when a new date is selected. */
_dateSelected(date: number) {
if (this._selectedDate == date) {
return;
if (this._selectedDate != date) {
const selectedYear = this._dateAdapter.getYear(this.activeDate);
const selectedMonth = this._dateAdapter.getMonth(this.activeDate);
const selectedDate = this._dateAdapter.createDate(selectedYear, selectedMonth, date);

this.selectedChange.emit(selectedDate);
}
this.selectedChange.emit(this._dateAdapter.createDate(
this._dateAdapter.getYear(this.activeDate), this._dateAdapter.getMonth(this.activeDate),
date));

this.userSelection.emit();
}

/** Initializes this month view. */
Expand Down

0 comments on commit 9ba5d84

Please sign in to comment.