]> source.dussan.org Git - vaadin-framework.git/commitdiff
M-day calendar event is hidden if firstVisibleHourOfDay is set (#14737)
authorAnna Miroshnik <anna.miroshnik@arcadia.spb.ru>
Fri, 24 Oct 2014 16:56:35 +0000 (20:56 +0400)
committerDenis Anisimov <denis@vaadin.com>
Mon, 31 Oct 2016 13:36:16 +0000 (13:36 +0000)
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

compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/CalendarEvent.java
compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/DateCell.java
uitest/src/main/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCase.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCaseTest.java [new file with mode: 0644]

index abb657c4b4ce1117be452f8b212e0f3cbae78bb2..24f9f60b5acd6388469ba66fe034839ce88e1d4a 100644 (file)
@@ -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;
     }
index 92e6f203452164e9a48c94bdbe72d53aac6140a0..31f443cd77aaac83d6eeda32f8bee00b50961809 100644 (file)
@@ -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);
         }
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 (file)
index 0000000..cb27699
--- /dev/null
@@ -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 (file)
index 0000000..de35ec8
--- /dev/null
@@ -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.");
+        }
+    }
+}