Browse Source

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
tags/8.0.0.alpha6
Anna Miroshnik 9 years ago
parent
commit
ee47a94e17

+ 4
- 5
compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/CalendarEvent.java View 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;
}

+ 19
- 7
compatibility-client/src/main/java/com/vaadin/v7/client/ui/calendar/schedule/DateCell.java View 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);
}

+ 81
- 0
uitest/src/main/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCase.java View File

@@ -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;
}

}

+ 113
- 0
uitest/src/test/java/com/vaadin/tests/components/calendar/SetFirstVisibleHourOfDaySpecialCaseTest.java View File

@@ -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.");
}
}
}

Loading…
Cancel
Save