@vaadin/date-picker 23.0.0-alpha1 → 23.0.0-alpha2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/date-picker",
3
- "version": "23.0.0-alpha1",
3
+ "version": "23.0.0-alpha2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -35,21 +35,21 @@
35
35
  "@polymer/iron-a11y-announcer": "^3.0.0",
36
36
  "@polymer/iron-media-query": "^3.0.0",
37
37
  "@polymer/polymer": "^3.2.0",
38
- "@vaadin/button": "23.0.0-alpha1",
39
- "@vaadin/component-base": "23.0.0-alpha1",
40
- "@vaadin/field-base": "23.0.0-alpha1",
41
- "@vaadin/input-container": "23.0.0-alpha1",
42
- "@vaadin/vaadin-lumo-styles": "23.0.0-alpha1",
43
- "@vaadin/vaadin-material-styles": "23.0.0-alpha1",
44
- "@vaadin/vaadin-overlay": "23.0.0-alpha1",
45
- "@vaadin/vaadin-themable-mixin": "23.0.0-alpha1"
38
+ "@vaadin/button": "23.0.0-alpha2",
39
+ "@vaadin/component-base": "23.0.0-alpha2",
40
+ "@vaadin/field-base": "23.0.0-alpha2",
41
+ "@vaadin/input-container": "23.0.0-alpha2",
42
+ "@vaadin/vaadin-lumo-styles": "23.0.0-alpha2",
43
+ "@vaadin/vaadin-material-styles": "23.0.0-alpha2",
44
+ "@vaadin/vaadin-overlay": "23.0.0-alpha2",
45
+ "@vaadin/vaadin-themable-mixin": "23.0.0-alpha2"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@esm-bundle/chai": "^4.3.4",
49
- "@vaadin/dialog": "23.0.0-alpha1",
50
- "@vaadin/polymer-legacy-adapter": "23.0.0-alpha1",
49
+ "@vaadin/dialog": "23.0.0-alpha2",
50
+ "@vaadin/polymer-legacy-adapter": "23.0.0-alpha2",
51
51
  "@vaadin/testing-helpers": "^0.3.2",
52
52
  "sinon": "^9.2.0"
53
53
  },
54
- "gitHead": "fbcb07328fdf88260e3b461088d207426b21c710"
54
+ "gitHead": "070f586dead02ca41b66717820c647f48bf1665f"
55
55
  }
@@ -74,6 +74,8 @@ class DatePickerLight extends ThemableMixin(DatePickerMixin(PolymerElement)) {
74
74
  opened="{{opened}}"
75
75
  on-vaadin-overlay-open="_onOverlayOpened"
76
76
  on-vaadin-overlay-close="_onOverlayClosed"
77
+ restore-focus-on-close
78
+ restore-focus-node="[[inputElement]]"
77
79
  theme$="[[__getOverlayTheme(theme, _overlayInitialized)]]"
78
80
  >
79
81
  <template>
@@ -137,17 +139,17 @@ class DatePickerLight extends ThemableMixin(DatePickerMixin(PolymerElement)) {
137
139
  this._setFocusElement(this.inputElement);
138
140
  }
139
141
 
142
+ /** @return {string | undefined} */
143
+ get _inputValue() {
144
+ return this.inputElement && this.inputElement[dashToCamelCase(this.attrForValue)];
145
+ }
146
+
140
147
  set _inputValue(value) {
141
148
  if (this.inputElement) {
142
149
  this.inputElement[dashToCamelCase(this.attrForValue)] = value;
143
150
  }
144
151
  }
145
152
 
146
- /** @return {string | undefined} */
147
- get _inputValue() {
148
- return this.inputElement && this.inputElement[dashToCamelCase(this.attrForValue)];
149
- }
150
-
151
153
  // Workaround https://github.com/vaadin/web-components/issues/2855
152
154
  /** @protected */
153
155
  _openedChanged(opened) {
@@ -3,7 +3,6 @@
3
3
  * Copyright (c) 2021 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import { addListener } from '@polymer/polymer/lib/utils/gestures.js';
7
6
  import { isIOS } from '@vaadin/component-base/src/browser-utils.js';
8
7
  import { KeyboardMixin } from '@vaadin/component-base/src/keyboard-mixin.js';
9
8
  import { DelegateFocusMixin } from '@vaadin/field-base/src/delegate-focus-mixin.js';
@@ -302,7 +301,7 @@ export const DatePickerMixin = (subclass) =>
302
301
  /** @private */
303
302
  _noInput: {
304
303
  type: Boolean,
305
- computed: '_isNoInput(inputElement, _fullscreen, _ios, i18n, i18n.*)'
304
+ computed: '_isNoInput(inputElement, _fullscreen, _ios, i18n, opened, autoOpenDisabled)'
306
305
  },
307
306
 
308
307
  /** @private */
@@ -349,6 +348,11 @@ export const DatePickerMixin = (subclass) =>
349
348
  return null;
350
349
  }
351
350
 
351
+ /** @protected */
352
+ get _inputValue() {
353
+ return this.inputElement ? this.inputElement.value : undefined;
354
+ }
355
+
352
356
  /** @protected */
353
357
  set _inputValue(value) {
354
358
  if (this.inputElement) {
@@ -356,11 +360,6 @@ export const DatePickerMixin = (subclass) =>
356
360
  }
357
361
  }
358
362
 
359
- /** @protected */
360
- get _inputValue() {
361
- return this.inputElement ? this.inputElement.value : undefined;
362
- }
363
-
364
363
  /** @private */
365
364
  get _nativeInput() {
366
365
  if (this.inputElement) {
@@ -415,17 +414,11 @@ export const DatePickerMixin = (subclass) =>
415
414
  ready() {
416
415
  super.ready();
417
416
 
418
- addListener(this, 'tap', (e) => {
417
+ this.addEventListener('click', (e) => {
419
418
  if (!this._isClearButton(e) && (!this.autoOpenDisabled || this._noInput)) {
420
419
  this.open();
421
420
  }
422
421
  });
423
-
424
- this.addEventListener('touchend', (e) => {
425
- if (!this._isClearButton(e)) {
426
- e.preventDefault();
427
- }
428
- });
429
422
  }
430
423
 
431
424
  /** @protected */
@@ -541,8 +534,17 @@ export const DatePickerMixin = (subclass) =>
541
534
  }
542
535
 
543
536
  /** @private */
544
- _isNoInput(inputElement, fullscreen, ios, i18n) {
545
- return !inputElement || fullscreen || ios || !i18n.parseDate;
537
+ // eslint-disable-next-line max-params
538
+ _isNoInput(inputElement, fullscreen, ios, i18n, opened, autoOpenDisabled) {
539
+ // On fullscreen mode, text input is disabled if auto-open isn't disabled or
540
+ // whenever the dropdown is opened
541
+ const noInputOnFullscreenMode = fullscreen && (!autoOpenDisabled || opened);
542
+ // On iOS, text input is disabled whenever the dropdown is opened, because
543
+ // the virtual keyboard doesn't affect the viewport metrics and thus the
544
+ // dropdown could get covered by the keyboard.
545
+ const noInputOnIos = ios && opened;
546
+
547
+ return !inputElement || noInputOnFullscreenMode || noInputOnIos || !i18n.parseDate;
546
548
  }
547
549
 
548
550
  /** @private */
@@ -901,15 +903,13 @@ export const DatePickerMixin = (subclass) =>
901
903
  this._selectedDate = this._overlayContent.focusedDate;
902
904
  }
903
905
  this.close();
906
+ } else if (!isValidDate && this.inputElement.value !== '') {
907
+ this.validate();
904
908
  } else {
905
- if (!isValidDate && this.inputElement.value !== '') {
909
+ const oldValue = this.value;
910
+ this._selectParsedOrFocusedDate();
911
+ if (oldValue === this.value) {
906
912
  this.validate();
907
- } else {
908
- const oldValue = this.value;
909
- this._selectParsedOrFocusedDate();
910
- if (oldValue === this.value) {
911
- this.validate();
912
- }
913
913
  }
914
914
  }
915
915
  break;
@@ -921,7 +921,7 @@ export const DatePickerMixin = (subclass) =>
921
921
  } else if (this.clearButtonVisible) {
922
922
  this._onClearButtonClick();
923
923
  } else if (this.autoOpenDisabled) {
924
- //Do not restore selected date if Esc was pressed after clearing input field
924
+ // Do not restore selected date if Esc was pressed after clearing input field
925
925
  if (this.inputElement.value === '') {
926
926
  this._selectedDate = null;
927
927
  }
@@ -934,7 +934,7 @@ export const DatePickerMixin = (subclass) =>
934
934
  case 'Tab':
935
935
  if (this.opened) {
936
936
  e.preventDefault();
937
- //Clear the selection range (remains visible on IE)
937
+ // Clear the selection range (remains visible on IE)
938
938
  this._setSelectionRange(0, 0);
939
939
  if (e.shiftKey) {
940
940
  this._overlayContent.focusCancel();
@@ -944,6 +944,8 @@ export const DatePickerMixin = (subclass) =>
944
944
  }
945
945
  }
946
946
  break;
947
+ default:
948
+ break;
947
949
  }
948
950
  }
949
951
 
@@ -8,12 +8,11 @@ import '@vaadin/button/src/vaadin-button.js';
8
8
  import './vaadin-month-calendar.js';
9
9
  import './vaadin-infinite-scroller.js';
10
10
  import { IronA11yAnnouncer } from '@polymer/iron-a11y-announcer/iron-a11y-announcer.js';
11
- import { GestureEventListeners } from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
12
- import { addListener, setTouchAction } from '@polymer/polymer/lib/utils/gestures.js';
13
11
  import { html, PolymerElement } from '@polymer/polymer/polymer-element.js';
14
12
  import { timeOut } from '@vaadin/component-base/src/async.js';
15
13
  import { Debouncer } from '@vaadin/component-base/src/debounce.js';
16
14
  import { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';
15
+ import { addListener, setTouchAction } from '@vaadin/component-base/src/gestures.js';
17
16
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
18
17
  import { dateEquals, extractDateParts, getClosestDate, getISOWeekNumber } from './vaadin-date-picker-helper.js';
19
18
 
@@ -21,7 +20,7 @@ import { dateEquals, extractDateParts, getClosestDate, getISOWeekNumber } from '
21
20
  * @extends HTMLElement
22
21
  * @private
23
22
  */
24
- class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListeners(PolymerElement))) {
23
+ class DatePickerOverlayContent extends ThemableMixin(DirMixin(PolymerElement)) {
25
24
  static get template() {
26
25
  return html`
27
26
  <style>
@@ -164,15 +163,15 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
164
163
 
165
164
  <div part="overlay-header" on-touchend="_preventDefault" desktop$="[[_desktopMode]]" aria-hidden="true">
166
165
  <div part="label">[[_formatDisplayed(selectedDate, i18n.formatDate, label)]]</div>
167
- <div part="clear-button" on-tap="_clear" showclear$="[[_showClear(selectedDate)]]"></div>
168
- <div part="toggle-button" on-tap="_cancel"></div>
166
+ <div part="clear-button" showclear$="[[_showClear(selectedDate)]]"></div>
167
+ <div part="toggle-button"></div>
169
168
 
170
- <div part="years-toggle-button" desktop$="[[_desktopMode]]" on-tap="_toggleYearScroller" aria-hidden="true">
169
+ <div part="years-toggle-button" desktop$="[[_desktopMode]]" aria-hidden="true">
171
170
  [[_yearAfterXMonths(_visibleMonthIndex)]]
172
171
  </div>
173
172
  </div>
174
173
 
175
- <div id="scrollers" desktop$="[[_desktopMode]]" on-track="_track">
174
+ <div id="scrollers" desktop$="[[_desktopMode]]">
176
175
  <vaadin-infinite-scroller
177
176
  id="monthScroller"
178
177
  on-custom-scroll="_onMonthScroll"
@@ -200,7 +199,6 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
200
199
  </vaadin-infinite-scroller>
201
200
  <vaadin-infinite-scroller
202
201
  id="yearScroller"
203
- on-tap="_onYearTap"
204
202
  on-custom-scroll="_onYearScroll"
205
203
  on-touchstart="_onYearScrollTouchStart"
206
204
  buffer-size="12"
@@ -227,13 +225,10 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
227
225
  part="today-button"
228
226
  theme="tertiary"
229
227
  disabled="[[!_isTodayAllowed(minDate, maxDate)]]"
230
- on-tap="_onTodayTap"
231
228
  >
232
229
  [[i18n.today]]
233
230
  </vaadin-button>
234
- <vaadin-button id="cancelButton" part="cancel-button" theme="tertiary" on-tap="_cancel">
235
- [[i18n.cancel]]
236
- </vaadin-button>
231
+ <vaadin-button id="cancelButton" part="cancel-button" theme="tertiary"> [[i18n.cancel]] </vaadin-button>
237
232
  </div>
238
233
  <iron-media-query query="(min-width: 375px)" query-matches="{{_desktopMode}}"></iron-media-query>
239
234
  `;
@@ -330,6 +325,17 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
330
325
  addListener(this, 'tap', this._stopPropagation);
331
326
  this.addEventListener('focus', this._onOverlayFocus.bind(this));
332
327
  this.addEventListener('blur', this._onOverlayBlur.bind(this));
328
+ addListener(this.$.scrollers, 'track', this._track.bind(this));
329
+ addListener(this.shadowRoot.querySelector('[part="clear-button"]'), 'tap', this._clear.bind(this));
330
+ addListener(this.shadowRoot.querySelector('[part="today-button"]'), 'tap', this._onTodayTap.bind(this));
331
+ addListener(this.shadowRoot.querySelector('[part="cancel-button"]'), 'tap', this._cancel.bind(this));
332
+ addListener(this.shadowRoot.querySelector('[part="toggle-button"]'), 'tap', this._cancel.bind(this));
333
+ addListener(this.shadowRoot.querySelector('[part="years"]'), 'tap', this._onYearTap.bind(this));
334
+ addListener(
335
+ this.shadowRoot.querySelector('[part="years-toggle-button"]'),
336
+ 'tap',
337
+ this._toggleYearScroller.bind(this)
338
+ );
333
339
  }
334
340
 
335
341
  /**
@@ -372,7 +378,6 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
372
378
  }
373
379
  })
374
380
  );
375
- return;
376
381
  }
377
382
 
378
383
  /**
@@ -473,9 +478,8 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
473
478
  _formatDisplayed(date, formatDate, label) {
474
479
  if (date) {
475
480
  return formatDate(extractDateParts(date));
476
- } else {
477
- return label;
478
481
  }
482
+ return label;
479
483
  }
480
484
 
481
485
  _onTodayTap() {
@@ -605,11 +609,9 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
605
609
  case 'start':
606
610
  this._toggleAnimateClass(false);
607
611
  break;
608
-
609
612
  case 'track':
610
613
  this._handleTrack(e);
611
614
  break;
612
-
613
615
  case 'end':
614
616
  this._toggleAnimateClass(true);
615
617
  if (this._translateX >= this._yearScrollerWidth / 2) {
@@ -618,6 +620,8 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
618
620
  this._openYearScroller();
619
621
  }
620
622
  break;
623
+ default:
624
+ break;
621
625
  }
622
626
  }
623
627
 
@@ -811,6 +815,8 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
811
815
  case 'Escape':
812
816
  this._cancel();
813
817
  break;
818
+ default:
819
+ break;
814
820
  }
815
821
  }
816
822
  }
@@ -837,20 +843,18 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
837
843
 
838
844
  if (this._dateAllowed(dateToFocus, this.minDate, this.maxDate)) {
839
845
  this._focusDate(dateToFocus);
840
- } else {
841
- if (this._dateAllowed(focus, this.minDate, this.maxDate)) {
842
- // Move to min or max date
843
- if (days > 0) {
844
- // down or right
845
- this._focusDate(this.maxDate);
846
- } else {
847
- // up or left
848
- this._focusDate(this.minDate);
849
- }
846
+ } else if (this._dateAllowed(focus, this.minDate, this.maxDate)) {
847
+ // Move to min or max date
848
+ if (days > 0) {
849
+ // down or right
850
+ this._focusDate(this.maxDate);
850
851
  } else {
851
- // Move to closest allowed date
852
- this._focusClosestDate(focus);
852
+ // up or left
853
+ this._focusDate(this.minDate);
853
854
  }
855
+ } else {
856
+ // Move to closest allowed date
857
+ this._focusClosestDate(focus);
854
858
  }
855
859
  }
856
860
 
@@ -869,20 +873,18 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
869
873
 
870
874
  if (this._dateAllowed(dateToFocus, this.minDate, this.maxDate)) {
871
875
  this.focusedDate = dateToFocus;
872
- } else {
873
- if (this._dateAllowed(focus, this.minDate, this.maxDate)) {
874
- // Move to min or max date
875
- if (months > 0) {
876
- // pagedown
877
- this._focusDate(this.maxDate);
878
- } else {
879
- // pageup
880
- this._focusDate(this.minDate);
881
- }
876
+ } else if (this._dateAllowed(focus, this.minDate, this.maxDate)) {
877
+ // Move to min or max date
878
+ if (months > 0) {
879
+ // pagedown
880
+ this._focusDate(this.maxDate);
882
881
  } else {
883
- // Move to closest allowed date
884
- this._focusClosestDate(focus);
882
+ // pageup
883
+ this._focusDate(this.minDate);
885
884
  }
885
+ } else {
886
+ // Move to closest allowed date
887
+ this._focusClosestDate(focus);
886
888
  }
887
889
  }
888
890
 
@@ -900,14 +902,12 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
900
902
 
901
903
  if (this._dateAllowed(dateToFocus, this.minDate, this.maxDate)) {
902
904
  this._focusDate(dateToFocus);
905
+ } else if (this._dateAllowed(focusedDate, this.minDate, this.maxDate)) {
906
+ // Move to minDate or maxDate
907
+ this._focusDate(this[property]);
903
908
  } else {
904
- if (this._dateAllowed(focusedDate, this.minDate, this.maxDate)) {
905
- // Move to minDate or maxDate
906
- this._focusDate(this[property]);
907
- } else {
908
- // Move to closest allowed date
909
- this._focusClosestDate(focusedDate);
910
- }
909
+ // Move to closest allowed date
910
+ this._focusClosestDate(focusedDate);
911
911
  }
912
912
  }
913
913
 
@@ -7,9 +7,9 @@ import '@polymer/iron-media-query/iron-media-query.js';
7
7
  import '@vaadin/input-container/src/vaadin-input-container.js';
8
8
  import './vaadin-date-picker-overlay.js';
9
9
  import './vaadin-date-picker-overlay-content.js';
10
- import { GestureEventListeners } from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
11
10
  import { html, PolymerElement } from '@polymer/polymer/polymer-element.js';
12
11
  import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
12
+ import { addListener } from '@vaadin/component-base/src/gestures.js';
13
13
  import { InputControlMixin } from '@vaadin/field-base/src/input-control-mixin.js';
14
14
  import { InputController } from '@vaadin/field-base/src/input-controller.js';
15
15
  import { LabelledInputController } from '@vaadin/field-base/src/labelled-input-controller.js';
@@ -116,9 +116,7 @@ registerStyles('vaadin-date-picker', [inputFieldShared, datePickerStyles], { mod
116
116
  * @mixes ThemableMixin
117
117
  * @mixes InputControlMixin
118
118
  */
119
- class DatePicker extends DatePickerMixin(
120
- InputControlMixin(GestureEventListeners(ThemableMixin(ElementMixin(PolymerElement))))
121
- ) {
119
+ class DatePicker extends DatePickerMixin(InputControlMixin(ThemableMixin(ElementMixin(PolymerElement)))) {
122
120
  static get is() {
123
121
  return 'vaadin-date-picker';
124
122
  }
@@ -147,7 +145,7 @@ class DatePicker extends DatePickerMixin(
147
145
  <slot name="prefix" slot="prefix"></slot>
148
146
  <slot name="input"></slot>
149
147
  <div id="clearButton" part="clear-button" slot="suffix"></div>
150
- <div part="toggle-button" slot="suffix" on-tap="_toggle" role="button"></div>
148
+ <div part="toggle-button" slot="suffix" role="button"></div>
151
149
  </vaadin-input-container>
152
150
 
153
151
  <div part="helper-text">
@@ -165,6 +163,8 @@ class DatePicker extends DatePickerMixin(
165
163
  theme$="[[__getOverlayTheme(theme, _overlayInitialized)]]"
166
164
  on-vaadin-overlay-open="_onOverlayOpened"
167
165
  on-vaadin-overlay-close="_onOverlayClosed"
166
+ restore-focus-on-close
167
+ restore-focus-node="[[inputElement]]"
168
168
  disable-upgrade
169
169
  >
170
170
  <template>
@@ -213,6 +213,7 @@ class DatePicker extends DatePickerMixin(
213
213
  })
214
214
  );
215
215
  this.addController(new LabelledInputController(this.inputElement, this._labelNode));
216
+ addListener(this.shadowRoot.querySelector('[part="toggle-button"]'), 'tap', this._toggle.bind(this));
216
217
  }
217
218
 
218
219
  /** @private */
@@ -209,6 +209,13 @@ class InfiniteScroller extends PolymerElement {
209
209
  });
210
210
  }
211
211
 
212
+ /**
213
+ * @private
214
+ */
215
+ get position() {
216
+ return (this.$.scroller.scrollTop - this._buffers[0].translateY) / this.itemHeight + this._firstIndex;
217
+ }
218
+
212
219
  /**
213
220
  * Current scroller position as index. Can be a fractional number.
214
221
  *
@@ -238,13 +245,6 @@ class InfiniteScroller extends PolymerElement {
238
245
  }
239
246
  }
240
247
 
241
- /**
242
- * @private
243
- */
244
- get position() {
245
- return (this.$.scroller.scrollTop - this._buffers[0].translateY) / this.itemHeight + this._firstIndex;
246
- }
247
-
248
248
  get itemHeight() {
249
249
  if (!this._itemHeightVal) {
250
250
  const itemHeight = getComputedStyle(this).getPropertyValue('--vaadin-infinite-scroller-item-height');
@@ -4,8 +4,8 @@
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import '@polymer/polymer/lib/elements/dom-repeat.js';
7
- import { GestureEventListeners } from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
8
7
  import { html, PolymerElement } from '@polymer/polymer/polymer-element.js';
8
+ import { addListener } from '@vaadin/component-base/src/gestures.js';
9
9
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
10
10
  import { dateAllowed, dateEquals, getISOWeekNumber } from './vaadin-date-picker-helper.js';
11
11
 
@@ -13,7 +13,7 @@ import { dateAllowed, dateEquals, getISOWeekNumber } from './vaadin-date-picker-
13
13
  * @extends HTMLElement
14
14
  * @private
15
15
  */
16
- class MonthCalendar extends ThemableMixin(GestureEventListeners(PolymerElement)) {
16
+ class MonthCalendar extends ThemableMixin(PolymerElement) {
17
17
  static get template() {
18
18
  return html`
19
19
  <style>
@@ -59,7 +59,7 @@ class MonthCalendar extends ThemableMixin(GestureEventListeners(PolymerElement))
59
59
  </style>
60
60
 
61
61
  <div part="month-header" role="heading">[[_getTitle(month, i18n.monthNames)]]</div>
62
- <div id="monthGrid" on-tap="_handleTap" on-touchend="_preventDefault" on-touchstart="_onMonthGridTouchStart">
62
+ <div id="monthGrid" on-touchend="_preventDefault" on-touchstart="_onMonthGridTouchStart">
63
63
  <div id="weekdays-container">
64
64
  <div hidden$="[[!_showWeekSeparator(showWeekNumbers, i18n.firstDayOfWeek)]]" part="weekday"></div>
65
65
  <div part="weekdays">
@@ -174,6 +174,12 @@ class MonthCalendar extends ThemableMixin(GestureEventListeners(PolymerElement))
174
174
  return ['_showWeekNumbersChanged(showWeekNumbers, i18n.firstDayOfWeek)'];
175
175
  }
176
176
 
177
+ /** @protected */
178
+ ready() {
179
+ super.ready();
180
+ addListener(this.$.monthGrid, 'tap', this._handleTap.bind(this));
181
+ }
182
+
177
183
  _dateEquals(date1, date2) {
178
184
  return dateEquals(date1, date2);
179
185
  }