int x = pos - (y * columns);
if (x == 0 && daysCount > 7) {
// Add week to weekToolbar for navigation
- weekToolbar.addWeek(week, d.getYear());
+ weekToolbar.addWeek(week, day.getYearOfWeek());
}
final SimpleDayCell cell = new SimpleDayCell(this, y, x);
cell.setMonthGrid(monthGrid);
List<CalendarDay> list = new ArrayList<CalendarDay>(days.size());
for (CalendarState.Day day : days) {
CalendarDay d = new CalendarDay(day.date, day.localizedDateFormat,
- day.dayOfWeek, day.week);
+ day.dayOfWeek, day.week, day.yearOfWeek);
list.add(d);
}
private String localizedDateFormat;
private int dayOfWeek;
private int week;
+ private int yearOfWeek;
public CalendarDay(String date, String localizedDateFormat, int dayOfWeek,
- int week) {
+ int week, int yearOfWeek) {
super();
this.date = date;
this.localizedDateFormat = localizedDateFormat;
this.dayOfWeek = dayOfWeek;
this.week = week;
+ this.yearOfWeek = yearOfWeek;
}
public String getDate() {
public int getWeek() {
return week;
}
+
+ public int getYearOfWeek() {
+ return yearOfWeek;
+ }
}
day.date = df_date.format(date);
day.localizedDateFormat = weeklyCaptionFormatter.format(date);
day.dayOfWeek = getDowByLocale(currentCalendar);
- day.week = currentCalendar.get(java.util.Calendar.WEEK_OF_YEAR);
+ day.week = getWeek(currentCalendar);
+ day.yearOfWeek = getYearOfWeek(currentCalendar);
days.add(day);
state.actions = createActionsList(actionMap);
}
+ private int getWeek(java.util.Calendar calendar) {
+ return calendar.get(java.util.Calendar.WEEK_OF_YEAR);
+ }
+
+ private int getYearOfWeek(java.util.Calendar calendar) {
+ // Would use calendar.getWeekYear() but it's only available since 1.7.
+ int week = getWeek(calendar);
+ int month = calendar.get(java.util.Calendar.MONTH);
+ int year = calendar.get(java.util.Calendar.YEAR);
+
+ if (week == 1 && month == java.util.Calendar.DECEMBER) {
+ return year + 1;
+ }
+
+ return year;
+ }
+
private void setActionsForEachHalfHour(
Map<CalendarDateRange, Set<Action>> actionMap, Date start,
Date end, Action.Handler actionHandler) {
String[] splitted = event.split("w");
if (splitted.length == 2) {
try {
- int yr = 1900 + Integer.parseInt(splitted[0]);
+ int yr = Integer.parseInt(splitted[0]);
int week = Integer.parseInt(splitted[1]);
fireWeekClick(week, yr);
} catch (NumberFormatException e) {
public String localizedDateFormat;
public int dayOfWeek;
public int week;
+ public int yearOfWeek;
}
public static class Action implements java.io.Serializable {
--- /dev/null
+package com.vaadin.tests.components.calendar;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Calendar;
+
+public class CalendarWeekSelection extends AbstractTestUI {
+ @Override
+ protected void setup(VaadinRequest request) {
+ Calendar calendar = new Calendar();
+ calendar.setLocale(Locale.US);
+
+ try {
+ calendar.setStartDate(new SimpleDateFormat("yyyy-MM-dd")
+ .parse("2013-12-15"));
+ calendar.setEndDate(new SimpleDateFormat("yyyy-MM-dd")
+ .parse("2014-01-15"));
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+
+ addComponent(calendar);
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 14783;
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "December 2013 - January 2014. Clicking the week 1 "
+ + "should open the week view for the first week of 2014.";
+ }
+}
--- /dev/null
+package com.vaadin.tests.components.calendar;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class CalendarWeekSelectionTest extends MultiBrowserTest {
+
+ @Test
+ public void correctYearIsSelected() {
+ openTestURL();
+
+ clickOnWeek("1");
+
+ assertThat(getFirstDayOfTheYear().getText(), is("Wednesday 1/1/14"));
+ }
+
+ private WebElement getFirstDayOfTheYear() {
+ WebElement header = findElement(By.className("v-calendar-header-week"));
+ List<WebElement> headerElements = header.findElements(By.tagName("td"));
+
+ // Wednesday is the first day of 2014.
+ return headerElements.get(4);
+ }
+
+ private void clickOnWeek(String week) {
+ for (WebElement e : findElements(By.className("v-calendar-week-number"))) {
+ if (e.getText().equals(week)) {
+ e.click();
+ break;
+ }
+ }
+ }
+}
\ No newline at end of file