@vaadin/date-time-picker 22.0.0-beta2 → 22.0.2

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-time-picker",
3
- "version": "22.0.0-beta2",
3
+ "version": "22.0.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -33,19 +33,19 @@
33
33
  ],
34
34
  "dependencies": {
35
35
  "@polymer/polymer": "^3.0.0",
36
- "@vaadin/component-base": "22.0.0-beta2",
37
- "@vaadin/custom-field": "22.0.0-beta2",
38
- "@vaadin/date-picker": "22.0.0-beta2",
39
- "@vaadin/field-base": "22.0.0-beta2",
40
- "@vaadin/time-picker": "22.0.0-beta2",
41
- "@vaadin/vaadin-lumo-styles": "22.0.0-beta2",
42
- "@vaadin/vaadin-material-styles": "22.0.0-beta2",
43
- "@vaadin/vaadin-themable-mixin": "22.0.0-beta2"
36
+ "@vaadin/component-base": "^22.0.2",
37
+ "@vaadin/custom-field": "^22.0.2",
38
+ "@vaadin/date-picker": "^22.0.2",
39
+ "@vaadin/field-base": "^22.0.2",
40
+ "@vaadin/time-picker": "^22.0.2",
41
+ "@vaadin/vaadin-lumo-styles": "^22.0.2",
42
+ "@vaadin/vaadin-material-styles": "^22.0.2",
43
+ "@vaadin/vaadin-themable-mixin": "^22.0.2"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@esm-bundle/chai": "^4.3.4",
47
- "@vaadin/testing-helpers": "^0.3.0",
47
+ "@vaadin/testing-helpers": "^0.3.2",
48
48
  "sinon": "^9.2.1"
49
49
  },
50
- "gitHead": "f13833683e6667f6ca6678452db14aa6b7eac4a4"
50
+ "gitHead": "df21370c4a655a38eac11f79686021ab3b0887ad"
51
51
  }
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import './vaadin-date-time-picker-date-picker.js';
7
7
  import './vaadin-date-time-picker-time-picker.js';
8
+ import { FlattenedNodesObserver } from '@polymer/polymer/lib/utils/flattened-nodes-observer.js';
8
9
  import { html, PolymerElement } from '@polymer/polymer/polymer-element.js';
9
10
  import { DisabledMixin } from '@vaadin/component-base/src/disabled-mixin.js';
10
11
  import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
@@ -327,6 +328,24 @@ class DateTimePicker extends FieldMixin(SlotMixin(DisabledMixin(ThemableMixin(El
327
328
  i18n: {
328
329
  type: Object,
329
330
  value: () => Object.assign({}, datePickerI18nDefaults, timePickerI18nDefaults)
331
+ },
332
+
333
+ /**
334
+ * The current slotted date picker.
335
+ * @private
336
+ */
337
+ __datePicker: {
338
+ type: HTMLElement,
339
+ observer: '__datePickerChanged'
340
+ },
341
+
342
+ /**
343
+ * The current slotted time picker.
344
+ * @private
345
+ */
346
+ __timePicker: {
347
+ type: HTMLElement,
348
+ observer: '__timePickerChanged'
330
349
  }
331
350
  };
332
351
  }
@@ -378,6 +397,10 @@ class DateTimePicker extends FieldMixin(SlotMixin(DisabledMixin(ThemableMixin(El
378
397
 
379
398
  this.__changeEventHandler = this.__changeEventHandler.bind(this);
380
399
  this.__valueChangedEventHandler = this.__valueChangedEventHandler.bind(this);
400
+
401
+ this._observer = new FlattenedNodesObserver(this, (info) => {
402
+ this.__onDomChange(info.addedNodes);
403
+ });
381
404
  }
382
405
 
383
406
  /** @protected */
@@ -390,11 +413,8 @@ class DateTimePicker extends FieldMixin(SlotMixin(DisabledMixin(ThemableMixin(El
390
413
  }
391
414
  });
392
415
 
393
- this.__datePickerChanged();
394
- this.__timePickerChanged();
395
-
396
- this.$.dateSlot.addEventListener('slotchange', this.__datePickerChanged.bind(this));
397
- this.$.timeSlot.addEventListener('slotchange', this.__timePickerChanged.bind(this));
416
+ this.__datePicker = this._getDirectSlotChild('date-picker');
417
+ this.__timePicker = this._getDirectSlotChild('time-picker');
398
418
 
399
419
  if (this.autofocus && !this.disabled) {
400
420
  window.requestAnimationFrame(() => this.focus());
@@ -405,14 +425,6 @@ class DateTimePicker extends FieldMixin(SlotMixin(DisabledMixin(ThemableMixin(El
405
425
  this.ariaTarget = this;
406
426
  }
407
427
 
408
- /**
409
- * Attribute used by `FieldMixin` to set accessible name.
410
- * @protected
411
- */
412
- get _ariaAttr() {
413
- return 'aria-labelledby';
414
- }
415
-
416
428
  /** @private */
417
429
  __filterElements(node) {
418
430
  return node.nodeType === Node.ELEMENT_NODE;
@@ -457,87 +469,98 @@ class DateTimePicker extends FieldMixin(SlotMixin(DisabledMixin(ThemableMixin(El
457
469
  }
458
470
 
459
471
  /** @private */
460
- __datePickerChanged() {
461
- const datePicker = this._getDirectSlotChild('date-picker');
462
- if (this.__datePicker === datePicker || !datePicker) {
472
+ __onDomChange(addedNodes) {
473
+ addedNodes
474
+ .filter((node) => node.nodeType === Node.ELEMENT_NODE)
475
+ .forEach((node) => {
476
+ const slotAttributeValue = node.getAttribute('slot');
477
+
478
+ if (slotAttributeValue === 'date-picker') {
479
+ this.__datePicker = node;
480
+ } else if (slotAttributeValue === 'time-picker') {
481
+ this.__timePicker = node;
482
+ }
483
+ });
484
+ }
485
+
486
+ /** @private */
487
+ __datePickerChanged(newDatePicker, existingDatePicker) {
488
+ if (!newDatePicker) {
463
489
  return;
464
490
  }
465
- if (this.__datePicker) {
491
+ if (existingDatePicker) {
466
492
  // Remove an existing date picker
467
- this.__removeInputListeners(this.__datePicker);
468
- this.__datePicker.remove();
493
+ this.__removeInputListeners(existingDatePicker);
494
+ existingDatePicker.remove();
469
495
  }
470
496
 
471
- this.__addInputListeners(datePicker);
472
- this.__datePicker = datePicker;
497
+ this.__addInputListeners(newDatePicker);
473
498
 
474
- if (datePicker.__defaultPicker) {
499
+ if (newDatePicker.__defaultPicker) {
475
500
  // Synchronize properties to default date picker
476
- datePicker.placeholder = this.datePlaceholder;
477
- datePicker.invalid = this.invalid;
478
- datePicker.initialPosition = this.initialPosition;
479
- datePicker.showWeekNumbers = this.showWeekNumbers;
480
- this.__syncI18n(datePicker, this, datePickerI18nProps);
501
+ newDatePicker.placeholder = this.datePlaceholder;
502
+ newDatePicker.invalid = this.invalid;
503
+ newDatePicker.initialPosition = this.initialPosition;
504
+ newDatePicker.showWeekNumbers = this.showWeekNumbers;
505
+ this.__syncI18n(newDatePicker, this, datePickerI18nProps);
481
506
  } else {
482
507
  // Synchronize properties from slotted date picker
483
- this.datePlaceholder = datePicker.placeholder;
484
- this.initialPosition = datePicker.initialPosition;
485
- this.showWeekNumbers = datePicker.showWeekNumbers;
486
- this.__syncI18n(this, datePicker, datePickerI18nProps);
508
+ this.datePlaceholder = newDatePicker.placeholder;
509
+ this.initialPosition = newDatePicker.initialPosition;
510
+ this.showWeekNumbers = newDatePicker.showWeekNumbers;
511
+ this.__syncI18n(this, newDatePicker, datePickerI18nProps);
487
512
  }
488
513
 
489
514
  // min and max are always synchronized from date time picker (host) to inner fields because time picker
490
515
  // min and max need to be dynamically set depending on currently selected date instead of simple propagation
491
- datePicker.min = this.__formatDateISO(this.__minDateTime, this.__defaultDateMinMaxValue);
492
- datePicker.max = this.__formatDateISO(this.__maxDateTime, this.__defaultDateMinMaxValue);
493
- datePicker.required = this.required;
494
- datePicker.disabled = this.disabled;
495
- datePicker.readonly = this.readonly;
496
- datePicker.autoOpenDisabled = this.autoOpenDisabled;
516
+ newDatePicker.min = this.__formatDateISO(this.__minDateTime, this.__defaultDateMinMaxValue);
517
+ newDatePicker.max = this.__formatDateISO(this.__maxDateTime, this.__defaultDateMinMaxValue);
518
+ newDatePicker.required = this.required;
519
+ newDatePicker.disabled = this.disabled;
520
+ newDatePicker.readonly = this.readonly;
521
+ newDatePicker.autoOpenDisabled = this.autoOpenDisabled;
497
522
 
498
523
  // Disable default internal validation for the component
499
- datePicker.validate = () => {};
500
- datePicker._validateInput = () => {};
524
+ newDatePicker.validate = () => {};
525
+ newDatePicker._validateInput = () => {};
501
526
  }
502
527
 
503
528
  /** @private */
504
- __timePickerChanged() {
505
- const timePicker = this._getDirectSlotChild('time-picker');
506
- if (this.__timePicker === timePicker || !timePicker) {
529
+ __timePickerChanged(newTimePicker, existingTimePicker) {
530
+ if (!newTimePicker) {
507
531
  return;
508
532
  }
509
- if (this.__timePicker) {
533
+ if (existingTimePicker) {
510
534
  // Remove an existing time picker
511
- this.__removeInputListeners(this.__timePicker);
512
- this.__timePicker.remove();
535
+ this.__removeInputListeners(existingTimePicker);
536
+ existingTimePicker.remove();
513
537
  }
514
538
 
515
- this.__addInputListeners(timePicker);
516
- this.__timePicker = timePicker;
539
+ this.__addInputListeners(newTimePicker);
517
540
 
518
- if (timePicker.__defaultPicker) {
541
+ if (newTimePicker.__defaultPicker) {
519
542
  // Synchronize properties to default time picker
520
- timePicker.placeholder = this.timePlaceholder;
521
- timePicker.step = this.step;
522
- timePicker.invalid = this.invalid;
523
- this.__syncI18n(timePicker, this, timePickerI18nProps);
543
+ newTimePicker.placeholder = this.timePlaceholder;
544
+ newTimePicker.step = this.step;
545
+ newTimePicker.invalid = this.invalid;
546
+ this.__syncI18n(newTimePicker, this, timePickerI18nProps);
524
547
  } else {
525
548
  // Synchronize properties from slotted time picker
526
- this.timePlaceholder = timePicker.placeholder;
527
- this.step = timePicker.step;
528
- this.__syncI18n(this, timePicker, timePickerI18nProps);
549
+ this.timePlaceholder = newTimePicker.placeholder;
550
+ this.step = newTimePicker.step;
551
+ this.__syncI18n(this, newTimePicker, timePickerI18nProps);
529
552
  }
530
553
 
531
554
  // min and max are always synchronized from parent to slotted because time picker min and max
532
555
  // need to be dynamically set depending on currently selected date instead of simple propagation
533
556
  this.__updateTimePickerMinMax();
534
- timePicker.required = this.required;
535
- timePicker.disabled = this.disabled;
536
- timePicker.readonly = this.readonly;
537
- timePicker.autoOpenDisabled = this.autoOpenDisabled;
557
+ newTimePicker.required = this.required;
558
+ newTimePicker.disabled = this.disabled;
559
+ newTimePicker.readonly = this.readonly;
560
+ newTimePicker.autoOpenDisabled = this.autoOpenDisabled;
538
561
 
539
562
  // Disable default internal validation for the component
540
- timePicker.validate = () => {};
563
+ newTimePicker.validate = () => {};
541
564
  }
542
565
 
543
566
  /** @private */
@@ -569,12 +592,10 @@ class DateTimePicker extends FieldMixin(SlotMixin(DisabledMixin(ThemableMixin(El
569
592
 
570
593
  /** @private */
571
594
  __i18nChanged(changeRecord) {
572
- this.__datePickerChanged();
573
595
  if (this.__datePicker) {
574
596
  this.__datePicker.set(changeRecord.path, changeRecord.value);
575
597
  }
576
598
 
577
- this.__timePickerChanged();
578
599
  if (this.__timePicker) {
579
600
  this.__timePicker.set(changeRecord.path, changeRecord.value);
580
601
  }