@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 +12 -12
- package/src/vaadin-date-picker-light.js +7 -5
- package/src/vaadin-date-picker-mixin.js +27 -25
- package/src/vaadin-date-picker-overlay-content.js +48 -48
- package/src/vaadin-date-picker.js +6 -5
- package/src/vaadin-infinite-scroller.js +7 -7
- package/src/vaadin-month-calendar.js +9 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vaadin/date-picker",
|
|
3
|
-
"version": "23.0.0-
|
|
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-
|
|
39
|
-
"@vaadin/component-base": "23.0.0-
|
|
40
|
-
"@vaadin/field-base": "23.0.0-
|
|
41
|
-
"@vaadin/input-container": "23.0.0-
|
|
42
|
-
"@vaadin/vaadin-lumo-styles": "23.0.0-
|
|
43
|
-
"@vaadin/vaadin-material-styles": "23.0.0-
|
|
44
|
-
"@vaadin/vaadin-overlay": "23.0.0-
|
|
45
|
-
"@vaadin/vaadin-themable-mixin": "23.0.0-
|
|
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-
|
|
50
|
-
"@vaadin/polymer-legacy-adapter": "23.0.0-
|
|
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": "
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
545
|
-
|
|
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
|
-
|
|
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(
|
|
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"
|
|
168
|
-
<div part="toggle-button"
|
|
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]]"
|
|
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]]"
|
|
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"
|
|
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
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
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
|
-
//
|
|
852
|
-
this.
|
|
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
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
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
|
-
//
|
|
884
|
-
this.
|
|
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
|
-
|
|
905
|
-
|
|
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"
|
|
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(
|
|
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-
|
|
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
|
}
|