diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueForm.java b/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueForm.java index 8631de2..3ab539a 100644 --- a/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueForm.java +++ b/kontor-spring/src/main/java/de/thpeetz/kontor/comics/views/IssueForm.java @@ -46,23 +46,8 @@ public class IssueForm extends FormLayout { public IssueForm(List comics, List volumes) { addClassName("issue-form"); - binder.forField(publishedOn).withConverter(new Converter() { - @Override - public Result convertToModel(String value, ValueContext context) { - try { - YearMonth result = YearMonth.parse(value); - return Result.ok(result); - } catch (DateTimeParseException e) { - return Result.error("invalid year-month format"); - } - } - - @Override - public String convertToPresentation(YearMonth value, ValueContext context) { - if (value == null) return ""; - return value.format(DateTimeFormatter.ofPattern("yyyy-MM")); - } - }).bind(Issue::getPublishedOn, Issue::setPublishedOn); + binder.forField(publishedOn).withConverter(new YearMonthConverter(publishedOn)). + bind(Issue::getPublishedOn, Issue::setPublishedOn); binder.bindInstanceFields(this); comic.setItems(comics); diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/common/views/MonthYearPicker.java b/kontor-spring/src/main/java/de/thpeetz/kontor/common/views/MonthYearPicker.java new file mode 100644 index 0000000..b6312f7 --- /dev/null +++ b/kontor-spring/src/main/java/de/thpeetz/kontor/common/views/MonthYearPicker.java @@ -0,0 +1,95 @@ +package de.thpeetz.kontor.common.views; + +import com.vaadin.flow.component.*; +import com.vaadin.flow.component.combobox.ComboBox; +import com.vaadin.flow.component.html.Div; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.shared.Registration; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDate; +import java.time.Month; +import java.time.YearMonth; +import java.time.ZoneId; +import java.time.format.TextStyle; +import java.util.List; +import java.util.Locale; +import java.util.stream.IntStream; + +@Route("date-picker-individual-input-fields") +@Slf4j +public class MonthYearPicker extends Div implements HasValue, String> { + + private final ComboBox yearPicker; + private final ComboBox monthPicker; + + public MonthYearPicker() { + LocalDate now = LocalDate.now(ZoneId.systemDefault()); + List selectableYears = IntStream.range(1970, now.getYear()).boxed().toList(); + + yearPicker = new ComboBox<>("Jahr", selectableYears); + yearPicker.setWidth(6, Unit.EM); + + monthPicker = new ComboBox<>("Monat", Month.values()); + monthPicker.setItemLabelGenerator(m -> m.getDisplayName(TextStyle.FULL, Locale.getDefault())); + monthPicker.setWidth(9, Unit.EM); + + add(new HorizontalLayout(yearPicker, monthPicker)); + } + + @Override + public void setValue(String value) { + log.info("MonthYearPicker.setValue({})", value); + } + + public void setValue(YearMonth value) { + log.info("MonthYearPicker.setValue({})", value.toString()); + } + + @Override + public String getValue() { + if (this.getYearMonth() != null) { + return this.getYearMonth().toString(); + } + return null; + } + + public YearMonth getYearMonth() { + if (yearPicker.getValue() != null && monthPicker.getValue() != null) { + int year = yearPicker.getValue(); + int month = monthPicker.getValue().getValue(); + YearMonth result = YearMonth.of(year, month); + log.info("MonthYearPicker.getYearMonth({})", result); + return result; + } else { + log.info("MonthYearPicker.getYearMonth(null)"); + return null; + } + } + + @Override + public Registration addValueChangeListener(ValueChangeListener> listener) { + return null; + } + + @Override + public void setReadOnly(boolean readOnly) { + + } + + @Override + public boolean isReadOnly() { + return false; + } + + @Override + public void setRequiredIndicatorVisible(boolean requiredIndicatorVisible) { + + } + + @Override + public boolean isRequiredIndicatorVisible() { + return false; + } +} diff --git a/kontor-spring/src/main/java/de/thpeetz/kontor/common/views/YearMonthConverter.java b/kontor-spring/src/main/java/de/thpeetz/kontor/common/views/YearMonthConverter.java new file mode 100644 index 0000000..3f0abf9 --- /dev/null +++ b/kontor-spring/src/main/java/de/thpeetz/kontor/common/views/YearMonthConverter.java @@ -0,0 +1,31 @@ +package de.thpeetz.kontor.common.views; + +import com.vaadin.flow.data.binder.Result; +import com.vaadin.flow.data.binder.ValueContext; +import com.vaadin.flow.data.converter.Converter; + +import java.time.*; +import java.time.format.*; + +public class YearMonthConverter implements Converter { + private MonthYearPicker monthYearPicker; + + public YearMonthConverter(MonthYearPicker monthYearPicker) { + this.monthYearPicker = monthYearPicker; + } + + @Override + public Result convertToModel(String value, ValueContext context) { + try { + YearMonth result = this.monthYearPicker.getYearMonth(); + return Result.ok(result); + } catch (DateTimeParseException e) { + return Result.error("invalid year-month format"); + } + } + + @Override + public String convertToPresentation(YearMonth value, ValueContext context) { + return monthYearPicker.getValue(); + } +}