Skip to content

Commit 5a3d1b1

Browse files
authored
fix(ui5-timepicker): prevent setting valueState="Error" on empty value
- Fixes the issue: when the user clears the input of the TimePicker, value-state="Error' is set, but should not as empty value is allowed and valid (this is how it works in openui5). And, the user also gets "change" event and he/she always can set "Error" state when encounter an empty value. - Refactors the TimePicker tests entirely, as they used to depend on some hardcoded ids that change whenever we add new TimePicker components in the test page. FIXES: #1398
1 parent ff46a59 commit 5a3d1b1

File tree

3 files changed

+57
-15
lines changed

3 files changed

+57
-15
lines changed

packages/main/src/TimePicker.js

+15-4
Original file line numberDiff line numberDiff line change
@@ -540,15 +540,26 @@ class TimePicker extends UI5Element {
540540
}
541541

542542
/**
543-
* Opens the picker.
543+
* Checks if a value is valid against the current format patternt of the TimePicker.
544+
*
545+
* <br><br>
546+
* <b>Note:</b> an empty string is considered as valid value.
547+
* @param {string} value The value to be tested against the current date format
544548
* @public
545549
*/
546-
isValid(value = "") {
550+
isValid(value) {
551+
if (value === "") {
552+
return true;
553+
}
547554
return !!(value && this.getFormat().parse(value));
548555
}
549556

550-
normalizeValue(sValue) {
551-
return this.getFormat().format(this.getFormat().parse(sValue));
557+
normalizeValue(value) {
558+
if (value === "") {
559+
return value;
560+
}
561+
562+
return this.getFormat().format(this.getFormat().parse(value));
552563
}
553564

554565
get _formatPattern() {

packages/main/test/pages/TimePicker.html

+7-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<ui5-timepicker id="timepicker2" format-pattern="hh:mm:ss" value=""></ui5-timepicker>
2525
<ui5-timepicker id="timepicker3" format-pattern="hh:mm:ss a"></ui5-timepicker>
2626
<ui5-timepicker id="timepicker3" format-pattern="HH:mm"></ui5-timepicker>
27-
27+
2828
<br /><br />
2929
<ui5-title>Test "change" event</ui5-title>
3030
<ui5-timepicker id="timepickerChange"></ui5-timepicker>
@@ -35,6 +35,12 @@
3535
<ui5-timepicker id="timepickerInput"></ui5-timepicker>
3636
<ui5-input id="inputResult"></ui5-input>
3737

38+
39+
<br /><br />
40+
<ui5-title>Test empty value</ui5-title>
41+
<ui5-timepicker id="timepickerEmptyValue"></ui5-timepicker>
42+
<ui5-button id="testBtn">btn for testing</ui5-button>
43+
3844
<script>
3945
var counter = 0;
4046
timepickerChange.addEventListener("change", function() {

packages/main/test/specs/TimePicker.spec.js

+35-10
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,63 @@ describe("TimePicker general interaction", () => {
44
browser.url("http://localhost:8080/test-resources/pages/TimePicker.html");
55

66
it("tests sliders value", () => {
7-
browser.$("#timepicker").setProperty("value", "11:12:13");
8-
browser.$("#timepicker").shadow$("ui5-input").$(".ui5-timepicker-input-icon-button").click();
7+
const timepicker = browser.$("#timepicker");
8+
const staticAreaItemClassName = browser.getStaticAreaItemClassName("#timepicker");
9+
const timepickerPopover = browser.$(`.${staticAreaItemClassName}`).shadow$("ui5-responsive-popover");
10+
11+
// act
12+
timepicker.setProperty("value", "11:12:13");
13+
timepicker.shadow$("ui5-input").$(".ui5-timepicker-input-icon-button").click();
914

10-
const timepickerPopover = browser.$$(".ui5wc_5")[0].shadow$$(".ui5-timepicker-popover")[0];
1115
const hoursSliderValue = timepickerPopover.$(".ui5-timepicker-hours-wheelslider").getValue();
1216
const minutesSliderValue = timepickerPopover.$(".ui5-timepicker-minutes-wheelslider").getValue();
1317
const secondsSliderValue = timepickerPopover.$(".ui5-timepicker-seconds-wheelslider").getValue();
1418

19+
// assert
1520
assert.strictEqual(hoursSliderValue, "11", "Hours are equal");
1621
assert.strictEqual(minutesSliderValue, "12", "Minutes are equal");
1722
assert.strictEqual(secondsSliderValue, "13", "Minutes are equal");
1823
});
1924

2025
it("tests sliders submit value", () => {
21-
const timepickerPopover = browser.$$(".ui5wc_5")[0].shadow$$(".ui5-timepicker-popover")[0];
26+
const timepicker = browser.$("#timepicker");
27+
const staticAreaItemClassName = browser.getStaticAreaItemClassName("#timepicker");
28+
const timepickerPopover = browser.$(`.${staticAreaItemClassName}`).shadow$("ui5-responsive-popover");
2229

23-
timepickerPopover.setProperty("opened",true);
30+
// act
31+
timepickerPopover.setProperty("opened", true);
2432
timepickerPopover.$(".ui5-timepicker-hours-wheelslider").setProperty("value","14");
2533
timepickerPopover.$(".ui5-timepicker-minutes-wheelslider").setProperty("value","15");
2634
timepickerPopover.$(".ui5-timepicker-seconds-wheelslider").setProperty("value","16");
2735
timepickerPopover.$("#submit").click();
2836

29-
const textValue = browser.$("#timepicker").shadow$$("#ui5wc_5-inner")[0].getValue();
37+
const textValue = timepicker.shadow$("ui5-input").getValue();
3038
assert.strictEqual(textValue.substring(0,2), "14", "Hours are equal");
3139
assert.strictEqual(textValue.substring(3,5), "15", "Minutes are equal");
3240
});
3341

3442
it("tests submit wrong value", () => {
35-
browser.$("#timepicker").click();
36-
browser.$("#timepicker").keys("123123123");
37-
browser.$("#timepicker").keys("Enter");
43+
const timepicker = browser.$("#timepicker");
44+
45+
timepicker.click();
46+
timepicker.keys("123123123");
47+
timepicker.keys("Enter");
48+
49+
assert.strictEqual(timepicker.shadow$("ui5-input").getProperty("valueState"), "Error", "The value state is on error");
50+
});
51+
52+
it("tests value state", () => {
53+
const timepicker = browser.$("#timepickerEmptyValue");
54+
const button = browser.$("#testBtn");
55+
56+
// act
57+
timepicker.click();
58+
while(timepicker.shadow$("ui5-input").getProperty("value") !== ""){
59+
timepicker.keys("Backspace");
60+
}
61+
button.click();
3862

39-
assert.strictEqual(browser.$("#timepicker").shadow$("ui5-input").getProperty("valueState"), "Error", "The value state is on error");
63+
// assert
64+
assert.strictEqual(timepicker.shadow$("ui5-input").getProperty("valueState"), "None", "The value state is None");
4065
});
4166
});

0 commit comments

Comments
 (0)