]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix VCalendar to use correct year of week. (#14783)
authorSauli Tähkäpää <sauli@vaadin.com>
Fri, 3 Oct 2014 21:03:38 +0000 (00:03 +0300)
committerSauli Tähkäpää <sauli@vaadin.com>
Mon, 10 Nov 2014 11:20:11 +0000 (13:20 +0200)
Change-Id: Id55ad5ed620bd5c187b70ae2a2d0a4c4adea382a

client/src/com/vaadin/client/ui/VCalendar.java
client/src/com/vaadin/client/ui/calendar/CalendarConnector.java
client/src/com/vaadin/client/ui/calendar/schedule/CalendarDay.java
server/src/com/vaadin/ui/Calendar.java
shared/src/com/vaadin/shared/ui/calendar/CalendarState.java
uitest/src/com/vaadin/tests/components/calendar/CalendarWeekSelection.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/calendar/CalendarWeekSelectionTest.java [new file with mode: 0644]

index f0f1bc89ca7436e7b65f2ab7ceb57ccc1c449f94..c59a78108c8a54efb197ff3f23ab40e0d774293f 100644 (file)
@@ -588,7 +588,7 @@ public class VCalendar extends Composite implements VHasDropHandler {
             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);
index cbf63768a358ce32444822436a26d1d4b7c60512..8f5e9d9a59feb7b622fe483ba41e22fe3decd9e5 100644 (file)
@@ -675,7 +675,7 @@ public class CalendarConnector extends AbstractComponentConnector implements
         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);
         }
index 44b82f166f5b49c5723cad75824f05ee275b11fc..0fceb6b6f92a5eccb5075f137766da4cafead10c 100644 (file)
@@ -27,14 +27,16 @@ public class CalendarDay {
     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() {
@@ -52,4 +54,8 @@ public class CalendarDay {
     public int getWeek() {
         return week;
     }
+
+    public int getYearOfWeek() {
+        return yearOfWeek;
+    }
 }
index 59dfceec9b17f5d6efe253d1ec1b09fcc928d124..92fdce4bd9774e585affdbc25262a76ef18d4d50 100644 (file)
@@ -516,7 +516,8 @@ public class Calendar extends AbstractComponent implements
             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);
 
@@ -560,6 +561,23 @@ public class Calendar extends AbstractComponent implements
         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) {
@@ -1768,7 +1786,7 @@ public class Calendar extends AbstractComponent implements
                 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) {
index de48f1a06ac045fa65411b60d34b6cb99348d779..93bd05bc1ec6bdfef7be9999454f74335a277cdd 100644 (file)
@@ -44,6 +44,7 @@ public class CalendarState extends AbstractComponentState {
         public String localizedDateFormat;
         public int dayOfWeek;
         public int week;
+        public int yearOfWeek;
     }
 
     public static class Action implements java.io.Serializable {
diff --git a/uitest/src/com/vaadin/tests/components/calendar/CalendarWeekSelection.java b/uitest/src/com/vaadin/tests/components/calendar/CalendarWeekSelection.java
new file mode 100644 (file)
index 0000000..c74f2a5
--- /dev/null
@@ -0,0 +1,39 @@
+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.";
+    }
+}
diff --git a/uitest/src/com/vaadin/tests/components/calendar/CalendarWeekSelectionTest.java b/uitest/src/com/vaadin/tests/components/calendar/CalendarWeekSelectionTest.java
new file mode 100644 (file)
index 0000000..83f4199
--- /dev/null
@@ -0,0 +1,41 @@
+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