First draft month views

master
Markus Kreth 7 years ago
parent 3709ddfdbe
commit 91cc7f7f54
  1. 74
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/calendar/WeeksOfMonth.java
  2. 29
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/calendar/Year.java
  3. 1324
      src/main/resources/jasper/calendar_year.jrxml
  4. 54
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/calendar/WeeksOfMonthTest.java

@ -0,0 +1,74 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.calendar;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class WeeksOfMonth {
private static final List<DayOfWeek> ORDERED_WEEKDAY = Arrays.asList(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY, DayOfWeek.THURSDAY, DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);
private final YearMonth yearMonth;
private final List<Map<DayOfWeek, Integer>> weeks;
public WeeksOfMonth(Month month, int year) {
this(YearMonth.of(year, month));
}
public WeeksOfMonth(YearMonth month) {
this.yearMonth = month;
weeks = Collections.unmodifiableList(createWeeks());
}
private List<Map<DayOfWeek, Integer>> createWeeks() {
LocalDate day = yearMonth.atDay(1);
List<Map<DayOfWeek, Integer>> result = new ArrayList<>();
Map<DayOfWeek, Integer> currentWeek = new HashMap<>();
int monthValue = yearMonth.getMonthValue();
while (day.getMonthValue() == monthValue) {
for (DayOfWeek d: ORDERED_WEEKDAY) {
if (d.equals(day.getDayOfWeek()) && day.getMonthValue() == monthValue) {
currentWeek.put(d, day.getDayOfMonth());
day = day.plusDays(1);
} else {
currentWeek.put(d, null);
}
}
result.add(Collections.unmodifiableMap(currentWeek));
currentWeek = new HashMap<>();
}
return result;
}
public int dayCount() {
return yearMonth.lengthOfMonth();
}
/**
* Week in Month >=0 && < {@link #weekCount()} depending on day count and weekday order.
* @param index
* @return
*/
public Map<DayOfWeek, Integer> getWeek(int index) {
return weeks.get(index);
}
/**
* Count of week (parts) in this month.
* @return
*/
public int weekCount() {
return weeks.size();
}
}

@ -4,16 +4,15 @@ import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.TextStyle;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.HashMap;
import java.util.Locale;
import java.util.Queue;
import java.util.Map;
public class Year {
private final LocalDate date;
private final Locale locale;
private final Map<Month, WeeksOfMonth> monthWeeks;
public Year(int year) {
this(year, Locale.getDefault());
@ -25,6 +24,10 @@ public class Year {
}
this.date = LocalDate.of(year, 1, 1);
this.locale = locale;
this.monthWeeks = new HashMap<>();
for (Month m: Month.values()) {
monthWeeks.put(m, new WeeksOfMonth(m, year));
}
}
public int getYear() {
@ -35,26 +38,18 @@ public class Year {
return month.getDisplayName(TextStyle.FULL_STANDALONE, locale);
}
List<Integer> days = Arrays.asList(null, null, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,28,30,31,32);
Queue<Integer> queue = new LinkedList<>(days);
/**
* Day of month, numeric for the specified by parameters.
* @param month month of the day
* @param week 1-5th week of the month
* @param week 1-6th week of the month
* @param dayOfWeek weekday of the week in the month.
* @return numeric value of the day of the month.
*/
public String getDay(Month month, short week, DayOfWeek dayOfWeek) {
if (queue.isEmpty()) {
queue.addAll(days);
}
Integer poll = queue.poll();
if (poll != null) {
return poll.toString();
} else {
return "";
}
Integer res = monthWeeks.get(month).getWeek(week - 1).get(dayOfWeek);
return res == null ? "" : res.toString();
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,54 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.calendar;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import java.time.DayOfWeek;
import java.time.Month;
import java.util.Map;
import org.junit.jupiter.api.Test;
class WeeksOfMonthTest {
@Test
void test2018November() {
WeeksOfMonth november = new WeeksOfMonth(Month.NOVEMBER, 2018);
assertNotNull(november);
assertEquals(30, november.dayCount());
assertEquals(5, november.weekCount());
Map<DayOfWeek, Integer> week = november.getWeek(0);
assertNotNull(week);
assertEquals(7, week.size());
assertNull(week.get(DayOfWeek.MONDAY));
assertNull(week.get(DayOfWeek.TUESDAY));
assertNull(week.get(DayOfWeek.WEDNESDAY));
assertEquals(1, week.get(DayOfWeek.THURSDAY).intValue());
assertEquals(2, week.get(DayOfWeek.FRIDAY).intValue());
assertEquals(4, week.get(DayOfWeek.SUNDAY).intValue());
week = november.getWeek(4);
assertEquals(26, week.get(DayOfWeek.MONDAY).intValue());
assertEquals(27, week.get(DayOfWeek.TUESDAY).intValue());
assertEquals(28, week.get(DayOfWeek.WEDNESDAY).intValue());
assertEquals(29, week.get(DayOfWeek.THURSDAY).intValue());
assertEquals(30, week.get(DayOfWeek.FRIDAY).intValue());
assertNull(week.get(DayOfWeek.SATURDAY));
assertNull(week.get(DayOfWeek.SUNDAY));
}
@Test
void testLastDayOfMonthIsMonday() {
WeeksOfMonth april = new WeeksOfMonth(Month.APRIL, 2018);
assertEquals(6, april.weekCount());
Map<DayOfWeek, Integer> week = april.getWeek(0);
assertNull(week.get(DayOfWeek.SATURDAY));
assertEquals(1, week.get(DayOfWeek.SUNDAY).intValue());
week = april.getWeek(5);
assertEquals(30, week.get(DayOfWeek.MONDAY).intValue());
assertNull(week.get(DayOfWeek.TUESDAY));
}
}
Loading…
Cancel
Save