Skip to content

Commit 66722b2

Browse files
authored
fix(ui5-daterange-picker): enable selection of single day (#2157)
1 parent 999344a commit 66722b2

File tree

3 files changed

+61
-16
lines changed

3 files changed

+61
-16
lines changed

packages/main/src/DateRangePicker.js

+44-16
Original file line numberDiff line numberDiff line change
@@ -92,21 +92,36 @@ class DateRangePicker extends DatePicker {
9292
constructor() {
9393
super();
9494
this.isFirstDatePick = true;
95+
this._initialRendering = true;
96+
this._oneTimeStampSelected = false; // Used to determine whether the first & last date is the same
97+
this._dayPickerMouseoverHandler = this._itemMouseoverHandler.bind(this);
9598
}
9699

97100
async onAfterRendering() {
98-
this.responsivePopover = await this._respPopover();
99-
const calendar = this.responsivePopover.querySelector(`#${this._id}-calendar`);
100-
const dayPicker = calendar.shadowRoot.querySelector(`#${calendar._id}-daypicker`);
101-
dayPicker.addEventListener("item-mouseover", this._itemMouseoverHandler);
102-
dayPicker.addEventListener("daypickerrendered", this._keyboardNavigationHandler);
101+
const daypicker = this.getDayPicker();
102+
this._cleanHoveredAttributeFromVisibleItems(daypicker);
103+
this._initialRendering = false;
104+
}
105+
106+
async onEnterDOM() {
107+
const daypicker = await this.getDayPicker();
108+
daypicker.addEventListener("item-mouseover", this._dayPickerMouseoverHandler);
109+
daypicker.addEventListener("daypickerrendered", this._keyboardNavigationHandler);
110+
}
103111

104-
this._cleanHoveredAttributeFromVisibleItems(dayPicker);
112+
async onExitDOM() {
113+
const daypicker = await this.getDayPicker();
114+
daypicker.removeEventListener("item-mouseover", this._dayPickerMouseoverHandler);
115+
daypicker.removeEventListener("daypickerrendered", this._keyboardNavigationHandler);
105116
}
106117

107118
_itemMouseoverHandler(event) {
119+
if (this._oneTimeStampSelected) {
120+
return;
121+
}
122+
108123
const dayItems = event.target.shadowRoot.querySelectorAll(".ui5-dp-item");
109-
const firstDateTimestamp = this._selectedDates[0];
124+
const firstDateTimestamp = event.target._selectedDates[0];
110125
const lastDateTimestamp = event.detail.target.parentElement.dataset.sapTimestamp;
111126

112127
for (let i = 0; i < dayItems.length; i++) {
@@ -198,6 +213,11 @@ class DateRangePicker extends DatePicker {
198213
timestamp = focusTimestamp || oCalDate.valueOf() / 1000,
199214
dates = this._splitValueByDelimiter(this.value);
200215

216+
if (this._initialRendering) {
217+
this._oneTimeStampSelected = dates[0].trim() === dates[1].trim();
218+
this._setValue(this.value);
219+
}
220+
201221
this._calendar = Object.assign({}, this._calendar);
202222
this._calendar.timestamp = timestamp;
203223
if (this.value && this._checkValueValidity(this.value)) {
@@ -245,10 +265,21 @@ class DateRangePicker extends DatePicker {
245265
return this.placeholder !== undefined ? this.placeholder : this._displayFormat.concat(" ", this.delimiter, " ", this._displayFormat);
246266
}
247267

268+
async getDayPicker() {
269+
this.responsivePopover = await this._respPopover();
270+
const calendar = this.responsivePopover.querySelector(`#${this._id}-calendar`);
271+
return calendar.shadowRoot.querySelector(`#${calendar._id}-daypicker`);
272+
}
273+
248274
async _handleInputChange() {
249275
const nextValue = await this._getInput().getInputValue();
250276
const emptyValue = nextValue === "";
251277
const isValid = emptyValue || this._checkValueValidity(nextValue);
278+
const dates = this._splitValueByDelimiter(nextValue);
279+
280+
if (dates.length === 2) {
281+
this._oneTimeStampSelected = dates[0].trim() === dates[1].trim();
282+
}
252283

253284
if (isValid) {
254285
this._setValue(nextValue);
@@ -307,13 +338,8 @@ class DateRangePicker extends DatePicker {
307338

308339
_handleCalendarChange(event) {
309340
const newValue = event.detail.dates && event.detail.dates[0];
310-
const calendarSelectedDates = this._calendar.selectedDates;
311-
312-
if (calendarSelectedDates[0] === newValue || calendarSelectedDates[calendarSelectedDates.length - 1] === newValue) {
313-
this.closePicker();
314-
return false;
315-
}
316341

342+
this._oneTimeStampSelected = false;
317343
if (this.isFirstDatePick) {
318344
this.isFirstDatePick = false;
319345
this._firstDateTimestamp = newValue;
@@ -327,6 +353,7 @@ class DateRangePicker extends DatePicker {
327353
this._lastDateTimestamp = this._firstDateTimestamp;
328354
this._firstDateTimestamp = newValue;
329355
} else {
356+
this._oneTimeStampSelected = newValue === this._firstDateTimestamp;
330357
this._lastDateTimestamp = newValue;
331358
}
332359
const fireChange = this._handleCalendarSelectedDatesChange();
@@ -356,12 +383,13 @@ class DateRangePicker extends DatePicker {
356383
return true;
357384
}
358385

359-
_cleanHoveredAttributeFromVisibleItems(dayPicker) {
386+
async _cleanHoveredAttributeFromVisibleItems(dayPicker) {
360387
if (!dayPicker) {
361388
return;
362389
}
363390

364-
const dayItems = dayPicker.shadowRoot.querySelectorAll(".ui5-dp-item");
391+
const daypicker = await this.getDayPicker();
392+
const dayItems = daypicker.shadowRoot.querySelectorAll(".ui5-dp-item");
365393

366394
for (let i = 0; i < dayItems.length; i++) {
367395
dayItems[i].removeAttribute("hovered");
@@ -382,7 +410,7 @@ class DateRangePicker extends DatePicker {
382410
lastDateString = format.format(new Date(lastDateValue * 1000));
383411

384412
if (firstDateValue) {
385-
if (delimiter && delimiter !== "" && lastDateString && lastDateString !== firstDateString) {
413+
if (delimiter && delimiter !== "" && lastDateString) {
386414
value = firstDateString.concat(" ", delimiter, " ", lastDateString);
387415
} else {
388416
value = firstDateString;

packages/main/test/pages/DateRangePicker.html

+3
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ <h3>daterange-picker in Compact</h3>
4747
<ui5-daterange-picker delimiter="@"></ui5-daterange-picker>
4848
</div>
4949
</section>
50+
51+
<h3>DateRange Picker with one date selected as first & last</h3>
52+
<ui5-daterange-picker id="daterange-picker5" value="Aug 20, 2020 - Aug 20, 2020"></ui5-daterange-picker>
5053
</div>
5154
<script>
5255
document.getElementById('daterange-picker1').addEventListener('ui5-change', function(e) {

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

+14
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ describe("DateRangePicker general interaction", () => {
5858
assert.strictEqual(res.lastDateValue, "2019-10-10T00:00:00.000Z", "The last date is JS Date format");
5959
});
6060

61+
it("Initially setting the same date as first & last is possible", () => {
62+
const daterangepicker = browser.$("#daterange-picker5");
63+
64+
assert.strictEqual(daterangepicker.getProperty("firstDateValue"), daterangepicker.getProperty("lastDateValue"), "Initially properties are set correctly");
65+
});
66+
67+
it("Setting the same date as first & last is possible", () => {
68+
const daterangepicker = browser.$("#daterange-picker5");
69+
70+
daterangepicker.setProperty("value", "Aug 5, 2020 - Aug 5, 2020");
71+
72+
assert.strictEqual(daterangepicker.getProperty("firstDateValue"), daterangepicker.getProperty("lastDateValue"), "Properties are set correctly");
73+
})
74+
6175
it("Change event fired once", () => {
6276
const staticAreaItemClassName = browser.getStaticAreaItemClassName("#daterange-picker1");
6377
const dayPicker = browser.$(`.${staticAreaItemClassName}`).shadow$(`ui5-calendar`).shadow$(`ui5-daypicker`);

0 commit comments

Comments
 (0)