@vaadin/time-picker 24.3.0-alpha2 → 24.3.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/time-picker",
3
- "version": "24.3.0-alpha2",
3
+ "version": "24.3.0-alpha4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -36,15 +36,15 @@
36
36
  ],
37
37
  "dependencies": {
38
38
  "@polymer/polymer": "^3.0.0",
39
- "@vaadin/combo-box": "24.3.0-alpha2",
40
- "@vaadin/component-base": "24.3.0-alpha2",
41
- "@vaadin/field-base": "24.3.0-alpha2",
42
- "@vaadin/input-container": "24.3.0-alpha2",
43
- "@vaadin/item": "24.3.0-alpha2",
44
- "@vaadin/overlay": "24.3.0-alpha2",
45
- "@vaadin/vaadin-lumo-styles": "24.3.0-alpha2",
46
- "@vaadin/vaadin-material-styles": "24.3.0-alpha2",
47
- "@vaadin/vaadin-themable-mixin": "24.3.0-alpha2"
39
+ "@vaadin/combo-box": "24.3.0-alpha4",
40
+ "@vaadin/component-base": "24.3.0-alpha4",
41
+ "@vaadin/field-base": "24.3.0-alpha4",
42
+ "@vaadin/input-container": "24.3.0-alpha4",
43
+ "@vaadin/item": "24.3.0-alpha4",
44
+ "@vaadin/overlay": "24.3.0-alpha4",
45
+ "@vaadin/vaadin-lumo-styles": "24.3.0-alpha4",
46
+ "@vaadin/vaadin-material-styles": "24.3.0-alpha4",
47
+ "@vaadin/vaadin-themable-mixin": "24.3.0-alpha4"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@esm-bundle/chai": "^4.3.4",
@@ -55,5 +55,5 @@
55
55
  "web-types.json",
56
56
  "web-types.lit.json"
57
57
  ],
58
- "gitHead": "0fd437292fa2a2f65e29b424d2456909ad2d684b"
58
+ "gitHead": "d6884bc788b98a4e8dfd14f3f399c6eb9022bd44"
59
59
  }
@@ -112,6 +112,22 @@ export interface TimePickerEventMap extends HTMLElementEventMap, TimePickerCusto
112
112
  *
113
113
  * See [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.
114
114
  *
115
+ * ### Change events
116
+ *
117
+ * Depending on the nature of the value change that the user attempts to commit e.g. by pressing Enter,
118
+ * the component can fire either a `change` event or an `unparsable-change` event:
119
+ *
120
+ * Value change | Event
121
+ * :------------------------|:------------------
122
+ * empty => parsable | change
123
+ * empty => unparsable | unparsable-change
124
+ * parsable => empty | change
125
+ * parsable => parsable | change
126
+ * parsable => unparsable | change
127
+ * unparsable => empty | unparsable-change
128
+ * unparsable => parsable | change
129
+ * unparsable => unparsable | unparsable-change
130
+ *
115
131
  * @fires {Event} change - Fired when the user commits a value change.
116
132
  * @fires {CustomEvent} invalid-changed - Fired when the `invalid` property changes.
117
133
  * @fires {CustomEvent} opened-changed - Fired when the `opened` property changes.
@@ -72,6 +72,22 @@ registerStyles('vaadin-time-picker', inputFieldShared, { moduleId: 'vaadin-time-
72
72
  *
73
73
  * See [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.
74
74
  *
75
+ * ### Change events
76
+ *
77
+ * Depending on the nature of the value change that the user attempts to commit e.g. by pressing Enter,
78
+ * the component can fire either a `change` event or an `unparsable-change` event:
79
+ *
80
+ * Value change | Event
81
+ * :------------------------|:------------------
82
+ * empty => parsable | change
83
+ * empty => unparsable | unparsable-change
84
+ * parsable => empty | change
85
+ * parsable => parsable | change
86
+ * parsable => unparsable | change
87
+ * unparsable => empty | unparsable-change
88
+ * unparsable => parsable | change
89
+ * unparsable => unparsable | unparsable-change
90
+ *
75
91
  * @fires {Event} change - Fired when the user commits a value change.
76
92
  * @fires {CustomEvent} invalid-changed - Fired when the `invalid` property changes.
77
93
  * @fires {CustomEvent} opened-changed - Fired when the `opened` property changes.
@@ -127,7 +143,6 @@ class TimePicker extends PatternMixin(InputControlMixin(ThemableMixin(ElementMix
127
143
  position-target="[[_inputContainer]]"
128
144
  theme$="[[_theme]]"
129
145
  on-change="__onComboBoxChange"
130
- on-validated="__onComboBoxValidated"
131
146
  on-has-input-value-changed="__onComboBoxHasInputValueChanged"
132
147
  >
133
148
  <vaadin-input-container
@@ -356,6 +371,20 @@ class TimePicker extends PatternMixin(InputControlMixin(ThemableMixin(ElementMix
356
371
  return this.$.clearButton;
357
372
  }
358
373
 
374
+ /**
375
+ * The input element's value when it cannot be parsed as a time, and an empty string otherwise.
376
+ *
377
+ * @private
378
+ * @return {string}
379
+ */
380
+ get __unparsableValue() {
381
+ if (this._inputElementValue && !this.i18n.parseTime(this._inputElementValue)) {
382
+ return this._inputElementValue;
383
+ }
384
+
385
+ return '';
386
+ }
387
+
359
388
  /** @protected */
360
389
  ready() {
361
390
  super.ready();
@@ -421,6 +450,25 @@ class TimePicker extends PatternMixin(InputControlMixin(ThemableMixin(ElementMix
421
450
  );
422
451
  }
423
452
 
453
+ /**
454
+ * @param {boolean} focused
455
+ * @override
456
+ * @protected
457
+ */
458
+ _setFocused(focused) {
459
+ super._setFocused(focused);
460
+
461
+ if (!focused) {
462
+ this.__commitValueChange();
463
+
464
+ // Do not validate when focusout is caused by document
465
+ // losing focus, which happens on browser tab switch.
466
+ if (document.hasFocus()) {
467
+ this.validate();
468
+ }
469
+ }
470
+ }
471
+
424
472
  /** @private */
425
473
  __validDayDivisor(step) {
426
474
  // Valid if undefined, or exact divides a day, or has millisecond resolution
@@ -471,21 +519,39 @@ class TimePicker extends PatternMixin(InputControlMixin(ThemableMixin(ElementMix
471
519
  this._comboBoxValue = this.i18n.formatTime(objWithStep);
472
520
  this.__useMemo = false;
473
521
 
474
- this.validate();
475
- this.__commitPendingValue();
522
+ this.__commitValueChange();
476
523
  }
477
524
 
478
- /** @private */
479
- __commitPendingValue() {
525
+ /**
526
+ * Depending on the nature of the value change that has occurred since
527
+ * the last commit attempt, triggers validation and fires an event:
528
+ *
529
+ * Value change | Event
530
+ * -------------------------|-------------------
531
+ * empty => parsable | change
532
+ * empty => unparsable | unparsable-change
533
+ * parsable => empty | change
534
+ * parsable => parsable | change
535
+ * parsable => unparsable | change
536
+ * unparsable => empty | unparsable-change
537
+ * unparsable => parsable | change
538
+ * unparsable => unparsable | unparsable-change
539
+ *
540
+ * @private
541
+ */
542
+ __commitValueChange() {
543
+ const unparsableValue = this.__unparsableValue;
544
+
480
545
  if (this.__committedValue !== this.value) {
481
- this.__dispatchChange();
482
- this.__committedValue = this.value;
546
+ this.validate();
547
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true }));
548
+ } else if (this.__committedUnparsableValue !== unparsableValue) {
549
+ this.validate();
550
+ this.dispatchEvent(new CustomEvent('unparsable-change'));
483
551
  }
484
- }
485
552
 
486
- /** @private */
487
- __dispatchChange() {
488
- this.dispatchEvent(new CustomEvent('change', { bubbles: true }));
553
+ this.__committedValue = this.value;
554
+ this.__committedUnparsableValue = unparsableValue;
489
555
  }
490
556
 
491
557
  /**
@@ -602,8 +668,9 @@ class TimePicker extends PatternMixin(InputControlMixin(ThemableMixin(ElementMix
602
668
 
603
669
  // Mark value set programmatically by the user
604
670
  // as committed for the change event detection.
605
- if (!this.__skipCommittedValueUpdate) {
671
+ if (!this.__keepCommittedValue) {
606
672
  this.__committedValue = value;
673
+ this.__committedUnparsableValue = '';
607
674
  }
608
675
 
609
676
  if (value !== '' && value !== null && !parsedObj) {
@@ -636,9 +703,9 @@ class TimePicker extends PatternMixin(InputControlMixin(ThemableMixin(ElementMix
636
703
  if (value !== newValue) {
637
704
  this._comboBoxValue = newValue;
638
705
  } else {
639
- this.__skipCommittedValueUpdate = true;
706
+ this.__keepCommittedValue = true;
640
707
  this.__updateValue(parsedObj);
641
- this.__skipCommittedValueUpdate = false;
708
+ this.__keepCommittedValue = false;
642
709
  }
643
710
  } else {
644
711
  // If the user input can not be parsed, set a flag
@@ -648,16 +715,16 @@ class TimePicker extends PatternMixin(InputControlMixin(ThemableMixin(ElementMix
648
715
  this.__keepInvalidInput = true;
649
716
  }
650
717
 
651
- this.__skipCommittedValueUpdate = true;
718
+ this.__keepCommittedValue = true;
652
719
  this.value = '';
653
- this.__skipCommittedValueUpdate = false;
720
+ this.__keepCommittedValue = false;
654
721
  }
655
722
  }
656
723
 
657
724
  /** @private */
658
725
  __onComboBoxChange(event) {
659
726
  event.stopPropagation();
660
- this.__commitPendingValue();
727
+ this.__commitValueChange();
661
728
  }
662
729
 
663
730
  /**
@@ -669,11 +736,6 @@ class TimePicker extends PatternMixin(InputControlMixin(ThemableMixin(ElementMix
669
736
  this._hasInputValue = this.$.comboBox._hasInputValue;
670
737
  }
671
738
 
672
- /** @private */
673
- __onComboBoxValidated() {
674
- this.validate();
675
- }
676
-
677
739
  /** @private */
678
740
  __updateValue(obj) {
679
741
  const timeString = this.__formatISO(this.__validateTime(obj)) || '';
package/web-types.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/time-picker",
4
- "version": "24.3.0-alpha2",
4
+ "version": "24.3.0-alpha4",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "elements": [
9
9
  {
10
10
  "name": "vaadin-time-picker",
11
- "description": "`<vaadin-time-picker>` is a Web Component providing a time-selection field.\n\n```html\n<vaadin-time-picker></vaadin-time-picker>\n```\n```js\ntimePicker.value = '14:30';\n```\n\nWhen the selected `value` is changed, a `value-changed` event is triggered.\n\n### Styling\n\nThe following custom properties are available for styling:\n\nCustom property | Description | Default\n----------------------------------------|----------------------------|---------\n`--vaadin-field-default-width` | Default width of the field | `12em`\n`--vaadin-combo-box-overlay-max-height` | Max height of the overlay | `65vh`\n\n`<vaadin-time-picker>` provides the same set of shadow DOM parts and state attributes as `<vaadin-text-field>`.\nSee [`<vaadin-text-field>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-text-field) for the styling documentation.\n\nIn addition to `<vaadin-text-field>` parts, the following parts are available for theming:\n\nPart name | Description\n----------------|----------------\n`toggle-button` | The toggle button\n\nIn addition to `<vaadin-text-field>` state attributes, the following state attributes are available for theming:\n\nAttribute | Description\n----------|------------------------------------------\n`opened` | Set when the time-picker dropdown is open\n\n### Internal components\n\nIn addition to `<vaadin-time-picker>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-time-picker-combo-box>` - has the same API as [`<vaadin-combo-box-light>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-combo-box-light).\n- `<vaadin-time-picker-overlay>` - has the same API as [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-overlay).\n- `<vaadin-time-picker-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-item).\n- [`<vaadin-input-container>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-input-container) - an internal element wrapping the input.\n\nNote: the `theme` attribute value set on `<vaadin-time-picker>` is\npropagated to the internal components listed above.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
11
+ "description": "`<vaadin-time-picker>` is a Web Component providing a time-selection field.\n\n```html\n<vaadin-time-picker></vaadin-time-picker>\n```\n```js\ntimePicker.value = '14:30';\n```\n\nWhen the selected `value` is changed, a `value-changed` event is triggered.\n\n### Styling\n\nThe following custom properties are available for styling:\n\nCustom property | Description | Default\n----------------------------------------|----------------------------|---------\n`--vaadin-field-default-width` | Default width of the field | `12em`\n`--vaadin-combo-box-overlay-max-height` | Max height of the overlay | `65vh`\n\n`<vaadin-time-picker>` provides the same set of shadow DOM parts and state attributes as `<vaadin-text-field>`.\nSee [`<vaadin-text-field>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-text-field) for the styling documentation.\n\nIn addition to `<vaadin-text-field>` parts, the following parts are available for theming:\n\nPart name | Description\n----------------|----------------\n`toggle-button` | The toggle button\n\nIn addition to `<vaadin-text-field>` state attributes, the following state attributes are available for theming:\n\nAttribute | Description\n----------|------------------------------------------\n`opened` | Set when the time-picker dropdown is open\n\n### Internal components\n\nIn addition to `<vaadin-time-picker>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-time-picker-combo-box>` - has the same API as [`<vaadin-combo-box-light>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-combo-box-light).\n- `<vaadin-time-picker-overlay>` - has the same API as [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-overlay).\n- `<vaadin-time-picker-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-item).\n- [`<vaadin-input-container>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-input-container) - an internal element wrapping the input.\n\nNote: the `theme` attribute value set on `<vaadin-time-picker>` is\npropagated to the internal components listed above.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.\n\n### Change events\n\nDepending on the nature of the value change that the user attempts to commit e.g. by pressing Enter,\nthe component can fire either a `change` event or an `unparsable-change` event:\n\nValue change | Event\n:------------------------|:------------------\nempty => parsable | change\nempty => unparsable | unparsable-change\nparsable => empty | change\nparsable => parsable | change\nparsable => unparsable | change\nunparsable => empty | unparsable-change\nunparsable => parsable | change\nunparsable => unparsable | unparsable-change",
12
12
  "attributes": [
13
13
  {
14
14
  "name": "disabled",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/time-picker",
4
- "version": "24.3.0-alpha2",
4
+ "version": "24.3.0-alpha4",
5
5
  "description-markup": "markdown",
6
6
  "framework": "lit",
7
7
  "framework-config": {
@@ -16,7 +16,7 @@
16
16
  "elements": [
17
17
  {
18
18
  "name": "vaadin-time-picker",
19
- "description": "`<vaadin-time-picker>` is a Web Component providing a time-selection field.\n\n```html\n<vaadin-time-picker></vaadin-time-picker>\n```\n```js\ntimePicker.value = '14:30';\n```\n\nWhen the selected `value` is changed, a `value-changed` event is triggered.\n\n### Styling\n\nThe following custom properties are available for styling:\n\nCustom property | Description | Default\n----------------------------------------|----------------------------|---------\n`--vaadin-field-default-width` | Default width of the field | `12em`\n`--vaadin-combo-box-overlay-max-height` | Max height of the overlay | `65vh`\n\n`<vaadin-time-picker>` provides the same set of shadow DOM parts and state attributes as `<vaadin-text-field>`.\nSee [`<vaadin-text-field>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-text-field) for the styling documentation.\n\nIn addition to `<vaadin-text-field>` parts, the following parts are available for theming:\n\nPart name | Description\n----------------|----------------\n`toggle-button` | The toggle button\n\nIn addition to `<vaadin-text-field>` state attributes, the following state attributes are available for theming:\n\nAttribute | Description\n----------|------------------------------------------\n`opened` | Set when the time-picker dropdown is open\n\n### Internal components\n\nIn addition to `<vaadin-time-picker>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-time-picker-combo-box>` - has the same API as [`<vaadin-combo-box-light>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-combo-box-light).\n- `<vaadin-time-picker-overlay>` - has the same API as [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-overlay).\n- `<vaadin-time-picker-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-item).\n- [`<vaadin-input-container>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha2/#/elements/vaadin-input-container) - an internal element wrapping the input.\n\nNote: the `theme` attribute value set on `<vaadin-time-picker>` is\npropagated to the internal components listed above.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
19
+ "description": "`<vaadin-time-picker>` is a Web Component providing a time-selection field.\n\n```html\n<vaadin-time-picker></vaadin-time-picker>\n```\n```js\ntimePicker.value = '14:30';\n```\n\nWhen the selected `value` is changed, a `value-changed` event is triggered.\n\n### Styling\n\nThe following custom properties are available for styling:\n\nCustom property | Description | Default\n----------------------------------------|----------------------------|---------\n`--vaadin-field-default-width` | Default width of the field | `12em`\n`--vaadin-combo-box-overlay-max-height` | Max height of the overlay | `65vh`\n\n`<vaadin-time-picker>` provides the same set of shadow DOM parts and state attributes as `<vaadin-text-field>`.\nSee [`<vaadin-text-field>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-text-field) for the styling documentation.\n\nIn addition to `<vaadin-text-field>` parts, the following parts are available for theming:\n\nPart name | Description\n----------------|----------------\n`toggle-button` | The toggle button\n\nIn addition to `<vaadin-text-field>` state attributes, the following state attributes are available for theming:\n\nAttribute | Description\n----------|------------------------------------------\n`opened` | Set when the time-picker dropdown is open\n\n### Internal components\n\nIn addition to `<vaadin-time-picker>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-time-picker-combo-box>` - has the same API as [`<vaadin-combo-box-light>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-combo-box-light).\n- `<vaadin-time-picker-overlay>` - has the same API as [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-overlay).\n- `<vaadin-time-picker-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-item).\n- [`<vaadin-input-container>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-alpha4/#/elements/vaadin-input-container) - an internal element wrapping the input.\n\nNote: the `theme` attribute value set on `<vaadin-time-picker>` is\npropagated to the internal components listed above.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.\n\n### Change events\n\nDepending on the nature of the value change that the user attempts to commit e.g. by pressing Enter,\nthe component can fire either a `change` event or an `unparsable-change` event:\n\nValue change | Event\n:------------------------|:------------------\nempty => parsable | change\nempty => unparsable | unparsable-change\nparsable => empty | change\nparsable => parsable | change\nparsable => unparsable | change\nunparsable => empty | unparsable-change\nunparsable => parsable | change\nunparsable => unparsable | unparsable-change",
20
20
  "extension": true,
21
21
  "attributes": [
22
22
  {