Vorbereitung Release 0.2.0 #83

Merged
tpeetz merged 178 commits from develop/0.2.0 into main 2026-01-29 22:50:42 +00:00
4 changed files with 60 additions and 135 deletions
Showing only changes of commit f1f49ab014 - Show all commits
@@ -1,7 +1,5 @@
package de.thpeetz.kontor.comics.views;
import java.time.*;
import java.time.format.*;
import java.util.List;
import com.vaadin.flow.component.ComponentEvent;
@@ -11,14 +9,15 @@ import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.checkbox.Checkbox;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.datepicker.*;
import com.vaadin.flow.component.formlayout.FormLayout;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.*;
import com.vaadin.flow.data.converter.*;
import de.thpeetz.kontor.comics.data.*;
import com.vaadin.flow.data.binder.BeanValidationBinder;
import com.vaadin.flow.data.binder.Binder;
import de.thpeetz.kontor.comics.data.Comic;
import de.thpeetz.kontor.comics.data.Issue;
import de.thpeetz.kontor.comics.data.Volume;
import de.thpeetz.kontor.common.views.*;
import lombok.extern.slf4j.Slf4j;
@@ -29,7 +28,7 @@ public class IssueForm extends FormLayout {
ComboBox<Volume> volume = new ComboBox<>("Volume");
TextField issueNumber = new TextField("Issue number");
TextField title = new TextField("Full Title");
MonthYearPicker publishedOn = new MonthYearPicker();
YearMonthField publishedOn = new YearMonthField();
Checkbox isRead = new Checkbox("Read");
Checkbox inStock = new Checkbox("In stock");
@@ -41,8 +40,6 @@ public class IssueForm extends FormLayout {
public IssueForm(List<Comic> comics) {
addClassName("issue-form");
binder.forField(publishedOn).withConverter(new YearMonthConverter(publishedOn)).
bind(Issue::getPublishedOn, Issue::setPublishedOn);
binder.bindInstanceFields(this);
comic.setItems(comics);
@@ -1,95 +0,0 @@
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<HasValue.ValueChangeEvent<String>, String> {
private final ComboBox<Integer> yearPicker;
private final ComboBox<Month> monthPicker;
public MonthYearPicker() {
LocalDate now = LocalDate.now(ZoneId.systemDefault());
List<Integer> 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<? super ValueChangeEvent<String>> 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;
}
}
@@ -1,31 +0,0 @@
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<String, YearMonth> {
private MonthYearPicker monthYearPicker;
public YearMonthConverter(MonthYearPicker monthYearPicker) {
this.monthYearPicker = monthYearPicker;
}
@Override
public Result<YearMonth> 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();
}
}
@@ -0,0 +1,54 @@
package de.thpeetz.kontor.common.views;
import com.vaadin.flow.component.Unit;
import com.vaadin.flow.component.customfield.CustomField;
import com.vaadin.flow.component.select.Select;
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;
@Slf4j
public class YearMonthField extends CustomField<YearMonth> {
private final Select<Integer> year = new Select<>();;
private final Select<Month> month = new Select<>();
public YearMonthField() {
LocalDate now = LocalDate.now(ZoneId.systemDefault());
List<Integer> selectableYears = IntStream.range(1970, now.getYear()).boxed().toList();
year.setItems(selectableYears);
year.setWidth(6, Unit.EM);
month.setItems(Month.values());
month.setItemLabelGenerator(m -> m.getDisplayName(TextStyle.FULL, Locale.getDefault()));
month.setWidth(9, Unit.EM);
add(year, month);
}
@Override
protected YearMonth generateModelValue() {
if (year.getValue() != null && month.getValue() != null) {
int yearValue = year.getValue();
int monthValue = month.getValue().getValue();
YearMonth result = YearMonth.of(yearValue, monthValue);
log.debug("YearMonthField.generateModelValue() = {}", result);
return result;
} else {
log.debug("YearMonthField.generateModelValue() = null");
return null;
}
}
@Override
protected void setPresentationValue(YearMonth yearMonth) {
if (yearMonth == null) return;
year.setValue(yearMonth.getYear());
month.setValue(yearMonth.getMonth());
}
}