Skip to content

Commit accc3d6

Browse files
authored
fix(ui5-time-picker): display value state message in popover's header correctly on mobile (#10795)
1 parent 80f9456 commit accc3d6

File tree

4 files changed

+33
-24
lines changed

4 files changed

+33
-24
lines changed

packages/main/src/DateTimeInput.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement
33
// Styles
44
import Input from "./Input.js";
55
import { property } from "@ui5/webcomponents-base/dist/decorators.js";
6+
import { isDesktop, isPhone, isTablet } from "@ui5/webcomponents-base/dist/Device.js";
67

78
/**
89
* Extention of the UI5 Input, so we do not modify Input's private properties within the datetime components.
@@ -27,7 +28,11 @@ class DateTimeInput extends Input {
2728
* @override
2829
*/
2930
get hasValueStateMessage() {
30-
return this._shouldOpenValueStatePopover && super.hasValueStateMessage;
31+
return this._shouldOpenValueStatePopover && super.hasValueStateMessage && !this._isMobileDevice;
32+
}
33+
34+
get _isMobileDevice() {
35+
return !isDesktop() && (isPhone() || isTablet());
3136
}
3237
}
3338

packages/main/src/TimePicker.ts

+25-21
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import {
3333
} from "@ui5/webcomponents-base/dist/Keys.js";
3434
import UI5Date from "@ui5/webcomponents-localization/dist/dates/UI5Date.js";
3535
import type Popover from "./Popover.js";
36-
import type ResponsivePopover from "./ResponsivePopover.js";
3736
import TimePickerTemplate from "./TimePickerTemplate.js";
3837
import type DateTimeInput from "./DateTimeInput.js";
3938
import type { InputAccInfo } from "./Input.js";
@@ -314,6 +313,12 @@ class TimePicker extends UI5Element implements IFormInputElement {
314313
@query("[ui5-time-selection-clocks]")
315314
_timeSelectionClocks?: TimeSelectionClocks;
316315

316+
@query("[ui5-popover]")
317+
_inputsPopover!: Popover;
318+
319+
@query("[ui5-datetime-input]")
320+
_dateTimeInput!: DateTimeInput;
321+
317322
tempValue?: string;
318323

319324
@i18n("@ui5/webcomponents")
@@ -408,12 +413,19 @@ class TimePicker extends UI5Element implements IFormInputElement {
408413
return !isDesktop() && (isPhone() || isTablet());
409414
}
410415

416+
get shouldDisplayValueStateMessageInResponsivePopover() {
417+
return this.hasValueStateText && !this._inputsPopover?.open;
418+
}
419+
411420
onTimeSelectionChange(e: CustomEvent<TimeSelectionChangeEventDetail>) {
412421
this.tempValue = e.detail.value; // every time the user changes the time selection -> update tempValue
413422
}
414423

415424
_togglePicker() {
416425
this.open = !this.open;
426+
if (this._isMobileDevice) {
427+
this._inputsPopover.open = false;
428+
}
417429
}
418430

419431
submitPickers() {
@@ -445,7 +457,7 @@ class TimePicker extends UI5Element implements IFormInputElement {
445457
*/
446458
openInputsPopover() {
447459
this.tempValue = this.value && this.isValid(this.value) ? this.value : this.getFormat().format(UI5Date.getInstance());
448-
const popover = this._getInputsPopover();
460+
const popover = this._inputsPopover;
449461
popover.opener = this;
450462
popover.open = true;
451463
this._isInputsPopoverOpen = true;
@@ -457,7 +469,7 @@ class TimePicker extends UI5Element implements IFormInputElement {
457469
* @returns Resolves when the Inputs popover is closed
458470
*/
459471
closeInputsPopover() {
460-
const popover = this._getInputsPopover();
472+
const popover = this._inputsPopover;
461473
popover.open = false;
462474
}
463475

@@ -483,7 +495,7 @@ class TimePicker extends UI5Element implements IFormInputElement {
483495
}
484496

485497
onInputsPopoverAfterOpen() {
486-
const popover = this._getInputsPopover();
498+
const popover = this._inputsPopover;
487499
popover.querySelector<TimeSelectionInputs>("[ui5-time-selection-inputs]")!._addNumericAttributes();
488500
}
489501

@@ -560,20 +572,8 @@ class TimePicker extends UI5Element implements IFormInputElement {
560572
return !this.disabled && this._isMobileDevice;
561573
}
562574

563-
_getPopover() {
564-
return this.shadowRoot!.querySelector<ResponsivePopover>("[ui5-responsive-popover]")!;
565-
}
566-
567-
_getInputsPopover() {
568-
return this.shadowRoot!.querySelector<Popover>("[ui5-popover]")!;
569-
}
570-
571-
_getDateTimeInput(): DateTimeInput {
572-
return this.shadowRoot!.querySelector<DateTimeInput>("[ui5-datetime-input]")!;
573-
}
574-
575575
_getInputField() {
576-
const input = this._getDateTimeInput();
576+
const input = this._dateTimeInput;
577577
return input && input.getInputDOMRef();
578578
}
579579

@@ -588,7 +588,7 @@ class TimePicker extends UI5Element implements IFormInputElement {
588588

589589
const target = e.target as HTMLElement;
590590

591-
if (target && this.open && this._getDateTimeInput().id === target.id && (isTabNext(e) || isTabPrevious(e) || isF6Next(e) || isF6Previous(e))) {
591+
if (target && this.open && this._dateTimeInput.id === target.id && (isTabNext(e) || isTabPrevious(e) || isF6Next(e) || isF6Previous(e))) {
592592
this._togglePicker();
593593
}
594594
if (this.open) {
@@ -703,15 +703,15 @@ class TimePicker extends UI5Element implements IFormInputElement {
703703
* Hides mobile device keyboard by temporary setting the input to readonly state.
704704
*/
705705
_hideMobileKeyboard() {
706-
this._getDateTimeInput().readonly = true;
707-
setTimeout(() => { this._getDateTimeInput().readonly = false; }, 0);
706+
this._dateTimeInput.readonly = true;
707+
setTimeout(() => { this._dateTimeInput.readonly = false; }, 0);
708708
}
709709

710710
_onfocusin(e: FocusEvent) {
711711
if (this._isMobileDevice) {
712712
this._hideMobileKeyboard();
713713
if (this._isInputsPopoverOpen) {
714-
const popover = this._getInputsPopover();
714+
const popover = this._inputsPopover;
715715
popover.applyFocus();
716716
}
717717
e.preventDefault();
@@ -754,6 +754,10 @@ class TimePicker extends UI5Element implements IFormInputElement {
754754
return this.valueState !== ValueState.None;
755755
}
756756

757+
get shouldDisplayValueStateMessageOnDesktop() {
758+
return this.valueStateMessage.length > 0 && !this.open && !this._isMobileDevice;
759+
}
760+
757761
get classes() {
758762
return {
759763
popover: {

packages/main/src/TimePickerPopoverTemplate.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export default function TimePickerPopoverTemplate(this: TimePicker) {
3131
onWheel={this._handleWheel}
3232
onKeyDown={this._onkeydown}
3333
>
34-
{this.hasValueStateText && valueStateTextHeader.call(this)}
34+
{this.shouldDisplayValueStateMessageInResponsivePopover && valueStateTextHeader.call(this)}
3535

3636
<TimeSelectionClocks
3737
id={`${this._id}-time-sel`}

packages/main/src/TimePickerTemplate.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export default function TimePickerTemplate(this: TimePicker) {
2626
onFocusIn={this._onfocusin}
2727
onKeyDown={this._onkeydown}
2828
>
29-
{this.valueStateMessage.length > 0 && !this.open &&
29+
{this.shouldDisplayValueStateMessageOnDesktop &&
3030
<slot
3131
name="valueStateMessage"
3232
slot="valueStateMessage"

0 commit comments

Comments
 (0)