@vaadin/date-picker 22.0.2 → 23.0.0-alpha4
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 +13 -13
- package/src/vaadin-date-picker-helper.js +1 -1
- package/src/vaadin-date-picker-light.d.ts +11 -2
- package/src/vaadin-date-picker-light.js +8 -7
- package/src/vaadin-date-picker-mixin.d.ts +1 -1
- package/src/vaadin-date-picker-mixin.js +21 -16
- package/src/vaadin-date-picker-overlay-content.js +69 -74
- package/src/vaadin-date-picker-overlay.js +1 -1
- package/src/vaadin-date-picker-styles.js +1 -1
- package/src/vaadin-date-picker.d.ts +11 -2
- package/src/vaadin-date-picker.js +8 -8
- package/src/vaadin-infinite-scroller.js +20 -10
- package/src/vaadin-month-calendar.js +10 -4
- package/theme/material/vaadin-date-picker-overlay-content-styles.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vaadin/date-picker",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "23.0.0-alpha4",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"main": "vaadin-date-picker.js",
|
|
20
20
|
"module": "vaadin-date-picker.js",
|
|
21
|
+
"type": "module",
|
|
21
22
|
"files": [
|
|
22
23
|
"src",
|
|
23
24
|
"theme",
|
|
@@ -32,24 +33,23 @@
|
|
|
32
33
|
],
|
|
33
34
|
"dependencies": {
|
|
34
35
|
"@open-wc/dedupe-mixin": "^1.3.0",
|
|
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": "
|
|
39
|
-
"@vaadin/component-base": "
|
|
40
|
-
"@vaadin/field-base": "
|
|
41
|
-
"@vaadin/input-container": "
|
|
42
|
-
"@vaadin/vaadin-lumo-styles": "
|
|
43
|
-
"@vaadin/vaadin-material-styles": "
|
|
44
|
-
"@vaadin/vaadin-overlay": "
|
|
45
|
-
"@vaadin/vaadin-themable-mixin": "
|
|
38
|
+
"@vaadin/button": "23.0.0-alpha4",
|
|
39
|
+
"@vaadin/component-base": "23.0.0-alpha4",
|
|
40
|
+
"@vaadin/field-base": "23.0.0-alpha4",
|
|
41
|
+
"@vaadin/input-container": "23.0.0-alpha4",
|
|
42
|
+
"@vaadin/vaadin-lumo-styles": "23.0.0-alpha4",
|
|
43
|
+
"@vaadin/vaadin-material-styles": "23.0.0-alpha4",
|
|
44
|
+
"@vaadin/vaadin-overlay": "23.0.0-alpha4",
|
|
45
|
+
"@vaadin/vaadin-themable-mixin": "23.0.0-alpha4"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@esm-bundle/chai": "^4.3.4",
|
|
49
|
-
"@vaadin/dialog": "
|
|
50
|
-
"@vaadin/polymer-legacy-adapter": "
|
|
49
|
+
"@vaadin/dialog": "23.0.0-alpha4",
|
|
50
|
+
"@vaadin/polymer-legacy-adapter": "23.0.0-alpha4",
|
|
51
51
|
"@vaadin/testing-helpers": "^0.3.2",
|
|
52
52
|
"sinon": "^9.2.0"
|
|
53
53
|
},
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "81e2deee5147bb7c1f4884760f4598613306f1fb"
|
|
55
55
|
}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
|
|
7
7
|
import { DatePickerMixin } from './vaadin-date-picker-mixin.js';
|
|
8
8
|
export { DatePickerDate, DatePickerI18n } from './vaadin-date-picker-mixin.js';
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Fired when the user commits a value change.
|
|
12
|
+
*/
|
|
13
|
+
export type DatePickerLightChangeEvent = Event & {
|
|
14
|
+
target: DatePickerLight;
|
|
15
|
+
};
|
|
16
|
+
|
|
10
17
|
/**
|
|
11
18
|
* Fired when the `opened` property changes.
|
|
12
19
|
*/
|
|
@@ -30,7 +37,9 @@ export interface DatePickerLightCustomEventMap {
|
|
|
30
37
|
'value-changed': DatePickerLightValueChangedEvent;
|
|
31
38
|
}
|
|
32
39
|
|
|
33
|
-
export interface DatePickerLightEventMap extends HTMLElementEventMap, DatePickerLightCustomEventMap {
|
|
40
|
+
export interface DatePickerLightEventMap extends HTMLElementEventMap, DatePickerLightCustomEventMap {
|
|
41
|
+
change: DatePickerLightChangeEvent;
|
|
42
|
+
}
|
|
34
43
|
|
|
35
44
|
/**
|
|
36
45
|
* `<vaadin-date-picker-light>` is a customizable version of the `<vaadin-date-picker>` providing
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import '@polymer/iron-media-query/iron-media-query.js';
|
|
@@ -74,7 +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
|
-
|
|
77
|
+
restore-focus-on-close
|
|
78
|
+
restore-focus-node="[[inputElement]]"
|
|
78
79
|
theme$="[[__getOverlayTheme(theme, _overlayInitialized)]]"
|
|
79
80
|
>
|
|
80
81
|
<template>
|
|
@@ -138,17 +139,17 @@ class DatePickerLight extends ThemableMixin(DatePickerMixin(PolymerElement)) {
|
|
|
138
139
|
this._setFocusElement(this.inputElement);
|
|
139
140
|
}
|
|
140
141
|
|
|
142
|
+
/** @return {string | undefined} */
|
|
143
|
+
get _inputValue() {
|
|
144
|
+
return this.inputElement && this.inputElement[dashToCamelCase(this.attrForValue)];
|
|
145
|
+
}
|
|
146
|
+
|
|
141
147
|
set _inputValue(value) {
|
|
142
148
|
if (this.inputElement) {
|
|
143
149
|
this.inputElement[dashToCamelCase(this.attrForValue)] = value;
|
|
144
150
|
}
|
|
145
151
|
}
|
|
146
152
|
|
|
147
|
-
/** @return {string | undefined} */
|
|
148
|
-
get _inputValue() {
|
|
149
|
-
return this.inputElement && this.inputElement[dashToCamelCase(this.attrForValue)];
|
|
150
|
-
}
|
|
151
|
-
|
|
152
153
|
// Workaround https://github.com/vaadin/web-components/issues/2855
|
|
153
154
|
/** @protected */
|
|
154
155
|
_openedChanged(opened) {
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import { isIOS } from '@vaadin/component-base/src/browser-utils.js';
|
|
7
|
+
import { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';
|
|
7
8
|
import { KeyboardMixin } from '@vaadin/component-base/src/keyboard-mixin.js';
|
|
8
9
|
import { DelegateFocusMixin } from '@vaadin/field-base/src/delegate-focus-mixin.js';
|
|
9
10
|
import { InputMixin } from '@vaadin/field-base/src/input-mixin.js';
|
|
11
|
+
import { VirtualKeyboardController } from '@vaadin/field-base/src/virtual-keyboard-controller.js';
|
|
10
12
|
import { dateAllowed, dateEquals, extractDateParts, getClosestDate } from './vaadin-date-picker-helper.js';
|
|
11
13
|
|
|
12
14
|
/**
|
|
13
15
|
* @polymerMixin
|
|
16
|
+
* @param {function(new:HTMLElement)} subclass
|
|
14
17
|
*/
|
|
15
18
|
export const DatePickerMixin = (subclass) =>
|
|
16
|
-
class VaadinDatePickerMixin extends DelegateFocusMixin(InputMixin(KeyboardMixin(subclass))) {
|
|
19
|
+
class VaadinDatePickerMixin extends ControllerMixin(DelegateFocusMixin(InputMixin(KeyboardMixin(subclass)))) {
|
|
17
20
|
static get properties() {
|
|
18
21
|
return {
|
|
19
22
|
/**
|
|
@@ -348,6 +351,11 @@ export const DatePickerMixin = (subclass) =>
|
|
|
348
351
|
return null;
|
|
349
352
|
}
|
|
350
353
|
|
|
354
|
+
/** @protected */
|
|
355
|
+
get _inputValue() {
|
|
356
|
+
return this.inputElement ? this.inputElement.value : undefined;
|
|
357
|
+
}
|
|
358
|
+
|
|
351
359
|
/** @protected */
|
|
352
360
|
set _inputValue(value) {
|
|
353
361
|
if (this.inputElement) {
|
|
@@ -355,11 +363,6 @@ export const DatePickerMixin = (subclass) =>
|
|
|
355
363
|
}
|
|
356
364
|
}
|
|
357
365
|
|
|
358
|
-
/** @protected */
|
|
359
|
-
get _inputValue() {
|
|
360
|
-
return this.inputElement ? this.inputElement.value : undefined;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
366
|
/** @private */
|
|
364
367
|
get _nativeInput() {
|
|
365
368
|
if (this.inputElement) {
|
|
@@ -419,6 +422,8 @@ export const DatePickerMixin = (subclass) =>
|
|
|
419
422
|
this.open();
|
|
420
423
|
}
|
|
421
424
|
});
|
|
425
|
+
|
|
426
|
+
this.addController(new VirtualKeyboardController(this));
|
|
422
427
|
}
|
|
423
428
|
|
|
424
429
|
/** @protected */
|
|
@@ -903,15 +908,13 @@ export const DatePickerMixin = (subclass) =>
|
|
|
903
908
|
this._selectedDate = this._overlayContent.focusedDate;
|
|
904
909
|
}
|
|
905
910
|
this.close();
|
|
911
|
+
} else if (!isValidDate && this.inputElement.value !== '') {
|
|
912
|
+
this.validate();
|
|
906
913
|
} else {
|
|
907
|
-
|
|
914
|
+
const oldValue = this.value;
|
|
915
|
+
this._selectParsedOrFocusedDate();
|
|
916
|
+
if (oldValue === this.value) {
|
|
908
917
|
this.validate();
|
|
909
|
-
} else {
|
|
910
|
-
const oldValue = this.value;
|
|
911
|
-
this._selectParsedOrFocusedDate();
|
|
912
|
-
if (oldValue === this.value) {
|
|
913
|
-
this.validate();
|
|
914
|
-
}
|
|
915
918
|
}
|
|
916
919
|
}
|
|
917
920
|
break;
|
|
@@ -923,7 +926,7 @@ export const DatePickerMixin = (subclass) =>
|
|
|
923
926
|
} else if (this.clearButtonVisible) {
|
|
924
927
|
this._onClearButtonClick();
|
|
925
928
|
} else if (this.autoOpenDisabled) {
|
|
926
|
-
//Do not restore selected date if Esc was pressed after clearing input field
|
|
929
|
+
// Do not restore selected date if Esc was pressed after clearing input field
|
|
927
930
|
if (this.inputElement.value === '') {
|
|
928
931
|
this._selectedDate = null;
|
|
929
932
|
}
|
|
@@ -936,7 +939,7 @@ export const DatePickerMixin = (subclass) =>
|
|
|
936
939
|
case 'Tab':
|
|
937
940
|
if (this.opened) {
|
|
938
941
|
e.preventDefault();
|
|
939
|
-
//Clear the selection range (remains visible on IE)
|
|
942
|
+
// Clear the selection range (remains visible on IE)
|
|
940
943
|
this._setSelectionRange(0, 0);
|
|
941
944
|
if (e.shiftKey) {
|
|
942
945
|
this._overlayContent.focusCancel();
|
|
@@ -946,6 +949,8 @@ export const DatePickerMixin = (subclass) =>
|
|
|
946
949
|
}
|
|
947
950
|
}
|
|
948
951
|
break;
|
|
952
|
+
default:
|
|
953
|
+
break;
|
|
949
954
|
}
|
|
950
955
|
}
|
|
951
956
|
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import '@polymer/iron-media-query/iron-media-query.js';
|
|
7
7
|
import '@vaadin/button/src/vaadin-button.js';
|
|
8
8
|
import './vaadin-month-calendar.js';
|
|
9
9
|
import './vaadin-infinite-scroller.js';
|
|
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
10
|
import { html, PolymerElement } from '@polymer/polymer/polymer-element.js';
|
|
11
|
+
import { announce } from '@vaadin/component-base/src/a11y-announcer.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
|
/**
|
|
@@ -344,35 +350,25 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
344
350
|
this._closeYearScroller();
|
|
345
351
|
this._toggleAnimateClass(true);
|
|
346
352
|
setTouchAction(this.$.scrollers, 'pan-y');
|
|
347
|
-
IronA11yAnnouncer.requestAvailability();
|
|
348
353
|
}
|
|
349
354
|
|
|
350
355
|
announceFocusedDate() {
|
|
351
|
-
|
|
352
|
-
|
|
356
|
+
const focusedDate = this._currentlyFocusedDate();
|
|
357
|
+
let messages = [];
|
|
353
358
|
if (dateEquals(focusedDate, new Date())) {
|
|
354
|
-
|
|
359
|
+
messages.push(this.i18n.today);
|
|
355
360
|
}
|
|
356
|
-
|
|
361
|
+
messages = messages.concat([
|
|
357
362
|
this.i18n.weekdays[focusedDate.getDay()],
|
|
358
363
|
focusedDate.getDate(),
|
|
359
364
|
this.i18n.monthNames[focusedDate.getMonth()],
|
|
360
365
|
focusedDate.getFullYear()
|
|
361
366
|
]);
|
|
362
367
|
if (this.showWeekNumbers && this.i18n.firstDayOfWeek === 1) {
|
|
363
|
-
|
|
364
|
-
|
|
368
|
+
messages.push(this.i18n.week);
|
|
369
|
+
messages.push(getISOWeekNumber(focusedDate));
|
|
365
370
|
}
|
|
366
|
-
|
|
367
|
-
new CustomEvent('iron-announce', {
|
|
368
|
-
bubbles: true,
|
|
369
|
-
composed: true,
|
|
370
|
-
detail: {
|
|
371
|
-
text: announce.join(' ')
|
|
372
|
-
}
|
|
373
|
-
})
|
|
374
|
-
);
|
|
375
|
-
return;
|
|
371
|
+
announce(messages.join(' '));
|
|
376
372
|
}
|
|
377
373
|
|
|
378
374
|
/**
|
|
@@ -406,18 +402,22 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
406
402
|
/**
|
|
407
403
|
* Scrolls the month and year scrollers enough to reveal the given date.
|
|
408
404
|
*/
|
|
409
|
-
revealDate(date) {
|
|
405
|
+
revealDate(date, animate = true) {
|
|
410
406
|
if (date) {
|
|
411
|
-
|
|
412
|
-
|
|
407
|
+
const diff = this._differenceInMonths(date, this._originDate);
|
|
408
|
+
const scrolledAboveViewport = this.$.monthScroller.position > diff;
|
|
413
409
|
|
|
414
|
-
|
|
415
|
-
|
|
410
|
+
const visibleArea = Math.max(
|
|
411
|
+
this.$.monthScroller.itemHeight,
|
|
412
|
+
this.$.monthScroller.clientHeight - this.$.monthScroller.bufferOffset * 2
|
|
413
|
+
);
|
|
414
|
+
const visibleItems = visibleArea / this.$.monthScroller.itemHeight;
|
|
415
|
+
const scrolledBelowViewport = this.$.monthScroller.position + visibleItems - 1 < diff;
|
|
416
416
|
|
|
417
417
|
if (scrolledAboveViewport) {
|
|
418
|
-
this._scrollToPosition(diff,
|
|
418
|
+
this._scrollToPosition(diff, animate);
|
|
419
419
|
} else if (scrolledBelowViewport) {
|
|
420
|
-
this._scrollToPosition(diff - visibleItems + 1,
|
|
420
|
+
this._scrollToPosition(diff - visibleItems + 1, animate);
|
|
421
421
|
}
|
|
422
422
|
}
|
|
423
423
|
}
|
|
@@ -473,9 +473,8 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
473
473
|
_formatDisplayed(date, formatDate, label) {
|
|
474
474
|
if (date) {
|
|
475
475
|
return formatDate(extractDateParts(date));
|
|
476
|
-
} else {
|
|
477
|
-
return label;
|
|
478
476
|
}
|
|
477
|
+
return label;
|
|
479
478
|
}
|
|
480
479
|
|
|
481
480
|
_onTodayTap() {
|
|
@@ -533,7 +532,7 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
533
532
|
if (t < 1) {
|
|
534
533
|
return (c / 2) * t * t + b;
|
|
535
534
|
}
|
|
536
|
-
t
|
|
535
|
+
t -= 1;
|
|
537
536
|
return (-c / 2) * (t * (t - 2) - 1) + b;
|
|
538
537
|
};
|
|
539
538
|
|
|
@@ -605,11 +604,9 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
605
604
|
case 'start':
|
|
606
605
|
this._toggleAnimateClass(false);
|
|
607
606
|
break;
|
|
608
|
-
|
|
609
607
|
case 'track':
|
|
610
608
|
this._handleTrack(e);
|
|
611
609
|
break;
|
|
612
|
-
|
|
613
610
|
case 'end':
|
|
614
611
|
this._toggleAnimateClass(true);
|
|
615
612
|
if (this._translateX >= this._yearScrollerWidth / 2) {
|
|
@@ -618,6 +615,8 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
618
615
|
this._openYearScroller();
|
|
619
616
|
}
|
|
620
617
|
break;
|
|
618
|
+
default:
|
|
619
|
+
break;
|
|
621
620
|
}
|
|
622
621
|
}
|
|
623
622
|
|
|
@@ -811,6 +810,8 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
811
810
|
case 'Escape':
|
|
812
811
|
this._cancel();
|
|
813
812
|
break;
|
|
813
|
+
default:
|
|
814
|
+
break;
|
|
814
815
|
}
|
|
815
816
|
}
|
|
816
817
|
}
|
|
@@ -837,20 +838,18 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
837
838
|
|
|
838
839
|
if (this._dateAllowed(dateToFocus, this.minDate, this.maxDate)) {
|
|
839
840
|
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
|
-
}
|
|
841
|
+
} else 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);
|
|
850
846
|
} else {
|
|
851
|
-
//
|
|
852
|
-
this.
|
|
847
|
+
// up or left
|
|
848
|
+
this._focusDate(this.minDate);
|
|
853
849
|
}
|
|
850
|
+
} else {
|
|
851
|
+
// Move to closest allowed date
|
|
852
|
+
this._focusClosestDate(focus);
|
|
854
853
|
}
|
|
855
854
|
}
|
|
856
855
|
|
|
@@ -869,20 +868,18 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
869
868
|
|
|
870
869
|
if (this._dateAllowed(dateToFocus, this.minDate, this.maxDate)) {
|
|
871
870
|
this.focusedDate = dateToFocus;
|
|
872
|
-
} else {
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
this._focusDate(this.maxDate);
|
|
878
|
-
} else {
|
|
879
|
-
// pageup
|
|
880
|
-
this._focusDate(this.minDate);
|
|
881
|
-
}
|
|
871
|
+
} else if (this._dateAllowed(focus, this.minDate, this.maxDate)) {
|
|
872
|
+
// Move to min or max date
|
|
873
|
+
if (months > 0) {
|
|
874
|
+
// pagedown
|
|
875
|
+
this._focusDate(this.maxDate);
|
|
882
876
|
} else {
|
|
883
|
-
//
|
|
884
|
-
this.
|
|
877
|
+
// pageup
|
|
878
|
+
this._focusDate(this.minDate);
|
|
885
879
|
}
|
|
880
|
+
} else {
|
|
881
|
+
// Move to closest allowed date
|
|
882
|
+
this._focusClosestDate(focus);
|
|
886
883
|
}
|
|
887
884
|
}
|
|
888
885
|
|
|
@@ -900,14 +897,12 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(GestureEventListen
|
|
|
900
897
|
|
|
901
898
|
if (this._dateAllowed(dateToFocus, this.minDate, this.maxDate)) {
|
|
902
899
|
this._focusDate(dateToFocus);
|
|
900
|
+
} else if (this._dateAllowed(focusedDate, this.minDate, this.maxDate)) {
|
|
901
|
+
// Move to minDate or maxDate
|
|
902
|
+
this._focusDate(this[property]);
|
|
903
903
|
} else {
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
this._focusDate(this[property]);
|
|
907
|
-
} else {
|
|
908
|
-
// Move to closest allowed date
|
|
909
|
-
this._focusClosestDate(focusedDate);
|
|
910
|
-
}
|
|
904
|
+
// Move to closest allowed date
|
|
905
|
+
this._focusClosestDate(focusedDate);
|
|
911
906
|
}
|
|
912
907
|
}
|
|
913
908
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import { DisableUpgradeMixin } from '@polymer/polymer/lib/mixins/disable-upgrade-mixin.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import { css } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
|
|
@@ -9,6 +9,13 @@ import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mix
|
|
|
9
9
|
import { DatePickerMixin } from './vaadin-date-picker-mixin.js';
|
|
10
10
|
export { DatePickerDate, DatePickerI18n } from './vaadin-date-picker-mixin.js';
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Fired when the user commits a value change.
|
|
14
|
+
*/
|
|
15
|
+
export type DatePickerChangeEvent = Event & {
|
|
16
|
+
target: DatePicker;
|
|
17
|
+
};
|
|
18
|
+
|
|
12
19
|
/**
|
|
13
20
|
* Fired when the `opened` property changes.
|
|
14
21
|
*/
|
|
@@ -32,7 +39,9 @@ export interface DatePickerCustomEventMap {
|
|
|
32
39
|
'value-changed': DatePickerValueChangedEvent;
|
|
33
40
|
}
|
|
34
41
|
|
|
35
|
-
export interface DatePickerEventMap extends HTMLElementEventMap, DatePickerCustomEventMap {
|
|
42
|
+
export interface DatePickerEventMap extends HTMLElementEventMap, DatePickerCustomEventMap {
|
|
43
|
+
change: DatePickerChangeEvent;
|
|
44
|
+
}
|
|
36
45
|
|
|
37
46
|
/**
|
|
38
47
|
* `<vaadin-date-picker>` is an input field that allows to enter a date by typing or by selecting from a calendar overlay.
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
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,7 +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"
|
|
168
|
-
|
|
166
|
+
restore-focus-on-close
|
|
167
|
+
restore-focus-node="[[inputElement]]"
|
|
169
168
|
disable-upgrade
|
|
170
169
|
>
|
|
171
170
|
<template>
|
|
@@ -213,7 +212,8 @@ class DatePicker extends DatePickerMixin(
|
|
|
213
212
|
this.ariaTarget = input;
|
|
214
213
|
})
|
|
215
214
|
);
|
|
216
|
-
this.addController(new LabelledInputController(this.inputElement, this.
|
|
215
|
+
this.addController(new LabelledInputController(this.inputElement, this._labelController));
|
|
216
|
+
addListener(this.shadowRoot.querySelector('[part="toggle-button"]'), 'tap', this._toggle.bind(this));
|
|
217
217
|
}
|
|
218
218
|
|
|
219
219
|
/** @private */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import { afterNextRender } from '@polymer/polymer/lib/utils/render-status.js';
|
|
@@ -186,9 +186,9 @@ class InfiniteScroller extends PolymerElement {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
// Check if we scrolled enough to translate the buffer positions.
|
|
189
|
-
const
|
|
190
|
-
const upperThresholdReached = scrollTop > this._buffers[1].translateY +
|
|
191
|
-
const lowerThresholdReached = scrollTop < this._buffers[0].translateY +
|
|
189
|
+
const offset = this.itemHeight + this.bufferOffset;
|
|
190
|
+
const upperThresholdReached = scrollTop > this._buffers[1].translateY + offset;
|
|
191
|
+
const lowerThresholdReached = scrollTop < this._buffers[0].translateY + offset;
|
|
192
192
|
|
|
193
193
|
if (upperThresholdReached || lowerThresholdReached) {
|
|
194
194
|
this._translateBuffer(lowerThresholdReached);
|
|
@@ -209,10 +209,24 @@ class InfiniteScroller extends PolymerElement {
|
|
|
209
209
|
});
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
/**
|
|
213
|
+
* @return {number}
|
|
214
|
+
*/
|
|
215
|
+
get bufferOffset() {
|
|
216
|
+
return this._buffers[0].offsetTop;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* @return {number}
|
|
221
|
+
*/
|
|
222
|
+
get position() {
|
|
223
|
+
return (this.$.scroller.scrollTop - this._buffers[0].translateY) / this.itemHeight + this._firstIndex;
|
|
224
|
+
}
|
|
225
|
+
|
|
212
226
|
/**
|
|
213
227
|
* Current scroller position as index. Can be a fractional number.
|
|
214
228
|
*
|
|
215
|
-
* @type {
|
|
229
|
+
* @type {number}
|
|
216
230
|
*/
|
|
217
231
|
set position(index) {
|
|
218
232
|
this._preventScrollEvent = true;
|
|
@@ -239,12 +253,8 @@ class InfiniteScroller extends PolymerElement {
|
|
|
239
253
|
}
|
|
240
254
|
|
|
241
255
|
/**
|
|
242
|
-
* @
|
|
256
|
+
* @return {number}
|
|
243
257
|
*/
|
|
244
|
-
get position() {
|
|
245
|
-
return (this.$.scroller.scrollTop - this._buffers[0].translateY) / this.itemHeight + this._firstIndex;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
258
|
get itemHeight() {
|
|
249
259
|
if (!this._itemHeightVal) {
|
|
250
260
|
const itemHeight = getComputedStyle(this).getPropertyValue('--vaadin-infinite-scroller-item-height');
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2016 - 2022 Vaadin Ltd.
|
|
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
|
}
|