Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular-Material "md-datepicker" directive - "md-open-on-focus" issue

As exampled in this fiddle, there's seems to be an inconsistency issue with opening the md-datepicker multiple times when using md-open-on-focus.

The problem occurs after opening and closing it for the first time (which works ok) - after that, it'll randomly open on click and become unstable.

<md-datepicker ng-model="timeModel" md-hide-icons="all" md-open-on-focus></md-datepicker>

Has anyone experienced the same behavior and found a solution? Thanks.

like image 255
Shaya Avatar asked May 01 '17 12:05

Shaya


People also ask

What is Mat datepicker toggle?

A datepicker is composed of a text input and a calendar pop-up, connected via the matDatepicker property on the text input. There is also an optional datepicker toggle button that gives the user an easy way to open the datepicker pop-up.


1 Answers

Currently, the problem with md-hide-icons="all" and md-open-on-focus used together is, when you click outside, the focus remains on the input. But, since there are no icons to click for and focus is already on the input, there is no way we can open the datepicker.

If you click outside, and click outside again, focus from the input is gone, and it will work normally from there on which should arguably be the expected behavior.

But if you don't want such behavior, we can do something to change it!

Now, having a look at the datePicker code, in the closeCalendarPane function, they have

self.calendarPaneOpenedFrom.focus();

which is responsible for keeping focus on input. If we remove it, it would lose focus while clicking outside (or selecting a date from the picker) which is exactly what we want. They have some code handling input when openOnFocus is true but not sure how that helps!

Forked jsfiddle (changed line is at #31449)

Also, changing the library code isn't what we would normally want to do. So, for now, you could have a workaround like having a callback on md-is-open and removing the focus from the input element inside callback using your favourite way (jQuery/angular.element or pure JS) [As mentioned by @quirimmo]

Hope that helps!

like image 123
tanmay Avatar answered Sep 22 '22 03:09

tanmay