Calendar week and day views should be correct when using setFirstVisibleHourOfDay() and the end event time is 00:00 of the following day. Fix + Tests. Change-Id: If9f42de5e9c476cb48a2f169f150b42a9c0ab6c2tags/8.0.0.alpha6
@@ -309,11 +309,10 @@ public class CalendarEvent { | |||
if (getEndTime().getTime() | |||
- getStartTime().getTime() > DateConstants.DAYINMILLIS) { | |||
isSeveralDays = true; | |||
} else { // if difference <= day -> there can be different cases | |||
if (getStart().compareTo(getEnd()) != 0 | |||
&& getEndTime().compareTo(getEnd()) != 0) { | |||
isSeveralDays = true; | |||
} | |||
} else { // if difference <= day -> | |||
isSeveralDays = (getStart().compareTo(getEnd()) != 0) | |||
&& !((getEndTime().getHours() == 0 | |||
&& getEndTime().getMinutes() == 0)); | |||
} | |||
return isSeveralDays; | |||
} |
@@ -56,7 +56,7 @@ public class DateCell extends FocusableComplexPanel implements MouseDownHandler, | |||
private boolean disabled = false; | |||
private int height; | |||
private final Element[] slotElements; | |||
private final List<DateCellSlot> slots = new ArrayList<DateCell.DateCellSlot>(); | |||
private final List<DateCellSlot> slots = new ArrayList<>(); | |||
private int[] slotElementHeights; | |||
private int startingSlotHeight; | |||
private Date today; | |||
@@ -104,7 +104,7 @@ public class DateCell extends FocusableComplexPanel implements MouseDownHandler, | |||
addStyleName("v-calendar-day-times"); | |||
handlers = new LinkedList<HandlerRegistration>(); | |||
handlers = new LinkedList<>(); | |||
// 2 slots / hour | |||
firstHour = weekgrid.getFirstHour(); | |||
@@ -278,11 +278,11 @@ public class DateCell extends FocusableComplexPanel implements MouseDownHandler, | |||
} | |||
public void recalculateEventWidths() { | |||
List<DateCellGroup> groups = new ArrayList<DateCellGroup>(); | |||
List<DateCellGroup> groups = new ArrayList<>(); | |||
int count = getWidgetCount(); | |||
List<Integer> handled = new ArrayList<Integer>(); | |||
List<Integer> handled = new ArrayList<>(); | |||
// Iterate through all events and group them. Events that overlaps | |||
// with each other, are added to the same group. | |||
@@ -345,8 +345,8 @@ public class DateCell extends FocusableComplexPanel implements MouseDownHandler, | |||
for (DateCellGroup g : groups) { | |||
int col = 0; | |||
int colCount = 0; | |||
List<Integer> order = new ArrayList<Integer>(); | |||
Map<Integer, Integer> columns = new HashMap<Integer, Integer>(); | |||
List<Integer> order = new ArrayList<>(); | |||
Map<Integer, Integer> columns = new HashMap<>(); | |||
for (Integer eventIndex : g.getItems()) { | |||
DateCellDayEvent d = (DateCellDayEvent) getWidget(eventIndex); | |||
d.setMoveWidth(width); | |||
@@ -534,7 +534,7 @@ public class DateCell extends FocusableComplexPanel implements MouseDownHandler, | |||
public void addEvent(DateCellDayEvent dayEvent) { | |||
Element main = getElement(); | |||
int index = 0; | |||
List<CalendarEvent> events = new ArrayList<CalendarEvent>(); | |||
List<CalendarEvent> events = new ArrayList<>(); | |||
// events are the only widgets in this panel | |||
// slots are just elements | |||
@@ -583,6 +583,18 @@ public class DateCell extends FocusableComplexPanel implements MouseDownHandler, | |||
int eventStartHours = eventStart.getHours(); | |||
int eventEndHours = eventEnd.getHours(); | |||
/* | |||
* Special case (#14737): if event end time is 00:00 of the | |||
* following day then isTimeOnDifferentDays() returns false | |||
* (according to logic of this method), so this case should be | |||
* handled here | |||
*/ | |||
if (!event.getStart().equals(event.getEnd()) | |||
&& (event.getEndTime().getHours() == 0 | |||
&& event.getEndTime().getMinutes() == 0)) { | |||
eventEndHours = 23; | |||
} | |||
display = !(eventEndHours < firstHour | |||
|| eventStartHours > lastHour); | |||
} |
@@ -0,0 +1,81 @@ | |||
/* | |||
* Copyright 2000-2014 Vaadin Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not | |||
* use this file except in compliance with the License. You may obtain a copy of | |||
* the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |||
* License for the specific language governing permissions and limitations under | |||
* the License. | |||
*/ | |||
package com.vaadin.tests.components.calendar; | |||
import java.text.ParseException; | |||
import java.text.SimpleDateFormat; | |||
import java.util.Locale; | |||
import com.vaadin.annotations.Theme; | |||
import com.vaadin.server.VaadinRequest; | |||
import com.vaadin.tests.components.AbstractTestUI; | |||
import com.vaadin.v7.ui.Calendar; | |||
import com.vaadin.v7.ui.Calendar.TimeFormat; | |||
import com.vaadin.v7.ui.components.calendar.event.BasicEvent; | |||
@Theme("tests-calendar") | |||
public class SetFirstVisibleHourOfDaySpecialCase extends AbstractTestUI { | |||
private Calendar calendar; | |||
@Override | |||
protected void setup(VaadinRequest request) { | |||
calendar = new Calendar(); | |||
try { | |||
BasicEvent event = new BasicEvent("EVENT NAME 1", "EVENT TOOLTIP 1", | |||
new SimpleDateFormat("yyyy-MM-dd HH:mm") | |||
.parse("2013-09-05 16:00"), | |||
new SimpleDateFormat("yyyy-MM-dd HH:mm") | |||
.parse("2013-09-06 00:00")); | |||
event.setStyleName("color1"); | |||
calendar.addEvent(event); | |||
} catch (ParseException e1) { // Nothing to do | |||
e1.printStackTrace(); | |||
} | |||
try { | |||
calendar.setStartDate( | |||
new SimpleDateFormat("yyyy-MM-dd").parse("2013-09-01")); | |||
calendar.setEndDate( | |||
new SimpleDateFormat("yyyy-MM-dd").parse("2013-09-30")); | |||
} catch (ParseException e) { // Nothing to do | |||
} | |||
calendar.setImmediate(true); | |||
calendar.setTimeFormat(TimeFormat.Format24H); | |||
calendar.setLocale(new Locale("en", "US")); | |||
calendar.setFirstVisibleHourOfDay(15); | |||
addComponent(calendar); | |||
calendar.setSizeFull(); | |||
setSizeFull(); | |||
} | |||
@Override | |||
protected String getTestDescription() { | |||
return "Calendar week and day views should work correctly when using setFirstVisibleHourOfDay() and " | |||
+ "setting the end time of event to 00:00 of the following day"; | |||
} | |||
@Override | |||
protected Integer getTicketNumber() { | |||
return 14737; | |||
} | |||
} |
@@ -0,0 +1,113 @@ | |||
/* | |||
* Copyright 2000-2014 Vaadin Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not | |||
* use this file except in compliance with the License. You may obtain a copy of | |||
* the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |||
* License for the specific language governing permissions and limitations under | |||
* the License. | |||
*/ | |||
package com.vaadin.tests.components.calendar; | |||
import java.util.List; | |||
import org.junit.Assert; | |||
import org.junit.Test; | |||
import org.openqa.selenium.By; | |||
import org.openqa.selenium.StaleElementReferenceException; | |||
import org.openqa.selenium.WebElement; | |||
import com.vaadin.testbench.parallel.BrowserUtil; | |||
import com.vaadin.tests.tb3.MultiBrowserTest; | |||
/** | |||
* Tests that calendar week and day views are correct when using | |||
* setFirstVisibleHourOfDay() and the end event time is 00:00 of the following | |||
* day | |||
*/ | |||
public class SetFirstVisibleHourOfDaySpecialCaseTest extends MultiBrowserTest { | |||
@Override | |||
protected boolean requireWindowFocusForIE() { | |||
return true; | |||
} | |||
@Test | |||
public void testDayView() { | |||
openTestURL(); | |||
// open day view | |||
clickElement("v-calendar-day-number", "5"); | |||
// first of all check if event is present in calendar view | |||
waitForElementPresent(By.className("v-calendar-event-content")); | |||
// check that event has correct height | |||
WebElement event = getDriver() | |||
.findElement(By.className("v-calendar-event-content")); | |||
WebElement dateSlot = getDriver() | |||
.findElement(By.className("v-datecellslot")); | |||
Assert.assertEquals( | |||
"The height of shown part of calendar event should be equal to 16 datecell slots", | |||
dateSlot.getSize().getHeight() * 16, | |||
event.getSize().getHeight()); | |||
} | |||
@Test | |||
public void testWeekView() { | |||
openTestURL(); | |||
// open week view | |||
clickElement("v-calendar-week-number", "36"); | |||
// first of all check if event is present in calendar view | |||
waitForElementPresent(By.className("v-calendar-event-content")); | |||
// check that event has correct height | |||
WebElement event = getDriver() | |||
.findElement(By.className("v-calendar-event-content")); | |||
WebElement dateSlot = getDriver() | |||
.findElement(By.className("v-datecellslot")); | |||
Assert.assertEquals( | |||
"The height of shown part of calendar event should be equal to 16 datecell slots", | |||
dateSlot.getSize().getHeight() * 16, | |||
event.getSize().getHeight()); | |||
} | |||
private void clickElement(String className, String text) { | |||
List<WebElement> elements = findElements(By.className(className)); | |||
boolean found = false; | |||
for (WebElement webElement : elements) { | |||
if (webElement.getText().equals(text)) { | |||
webElement.click(); | |||
if (BrowserUtil.isIE8(getDesiredCapabilities())) { | |||
try { | |||
// sometimes the element only gets focus from click and | |||
// we need to click the text, which is in the right edge | |||
// of the element | |||
testBenchElement(webElement) | |||
.click(webElement.getSize().getWidth() - 5, 9); | |||
} catch (StaleElementReferenceException e) { | |||
// the first click succeeded after all | |||
} | |||
} | |||
found = true; | |||
break; | |||
} | |||
} | |||
if (!found) { | |||
Assert.fail("Element " + className + " with text " + text | |||
+ " not found."); | |||
} | |||
} | |||
} |