From ee47a94e17aadae18fbee6ad804e35ab12446df5 Mon Sep 17 00:00:00 2001 From: Anna Miroshnik Date: Fri, 24 Oct 2014 20:56:35 +0400 Subject: [PATCH] M-day calendar event is hidden if firstVisibleHourOfDay is set (#14737) 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: If9f42de5e9c476cb48a2f169f150b42a9c0ab6c2 --- .../ui/calendar/schedule/CalendarEvent.java | 9 +- .../client/ui/calendar/schedule/DateCell.java | 26 ++-- .../SetFirstVisibleHourOfDaySpecialCase.java | 81 +++++++++++++ ...tFirstVisibleHourOfDaySpecialCaseTest.java | 113 ++++++++++++++++++ 4 files changed, 217 insertions(+), 12 deletions(-) create mode 100644 uitest/src/main/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCase.java create mode 100644 uitest/src/test/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCaseTest.java diff --git a/compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/CalendarEvent.java b/compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/CalendarEvent.java index abb657c4b4..24f9f60b5a 100644 --- a/compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/CalendarEvent.java +++ b/compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/CalendarEvent.java @@ -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; } diff --git a/compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/DateCell.java b/compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/DateCell.java index 92e6f20345..31f443cd77 100644 --- a/compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/DateCell.java +++ b/compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/DateCell.java @@ -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 slots = new ArrayList(); + private final List 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(); + handlers = new LinkedList<>(); // 2 slots / hour firstHour = weekgrid.getFirstHour(); @@ -278,11 +278,11 @@ public class DateCell extends FocusableComplexPanel implements MouseDownHandler, } public void recalculateEventWidths() { - List groups = new ArrayList(); + List groups = new ArrayList<>(); int count = getWidgetCount(); - List handled = new ArrayList(); + List 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 order = new ArrayList(); - Map columns = new HashMap(); + List order = new ArrayList<>(); + Map 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 events = new ArrayList(); + List 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); } diff --git a/uitest/src/main/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCase.java b/uitest/src/main/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCase.java new file mode 100644 index 0000000000..cb2769990b --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCase.java @@ -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; + } + +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCaseTest.java b/uitest/src/test/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCaseTest.java new file mode 100644 index 0000000000..de35ec8d54 --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCaseTest.java @@ -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 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."); + } + } +} -- 2.39.5