Add field published_on and title to Issue
/refs #16 Add field published_on and title to Issue and display both fields.
This commit is contained in:
@@ -64,7 +64,8 @@ dependencies {
|
||||
implementation 'com.h2database:h2'
|
||||
implementation libs.hsqldb
|
||||
implementation 'org.postgresql:postgresql'
|
||||
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
|
||||
//runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
|
||||
implementation libs.hypersistence
|
||||
implementation libs.mail
|
||||
implementation libs.jackson
|
||||
implementation libs.gson
|
||||
|
||||
@@ -24,6 +24,7 @@ gson = "2.9.0"
|
||||
jackson = "2.16.1"
|
||||
json_simple = "1.1.1"
|
||||
mail = "1.6.2"
|
||||
hypersistence = "3.9.10"
|
||||
|
||||
[libraries]
|
||||
args4j = { module = "args4j:args4j", version.ref = "args4j" }
|
||||
@@ -40,6 +41,7 @@ jackson = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref
|
||||
json = { module = "com.googlecode.json-simple:json-simple", version.ref ="json_simple" }
|
||||
mail = { module = "com.sun.mail:javax.mail", version.ref ="mail" }
|
||||
sqlite-jdbc = { module = "org.xerial:sqlite-jdbc", version.ref = "sqlite" }
|
||||
hypersistence = { module = "io.hypersistence:hypersistence-utils-hibernate-63", version.ref = "hypersistence" }
|
||||
vaadin-bom = { module = "com.vaadin:vaadin-bom", version.ref = "vaadin" }
|
||||
asciidoctorGradleJvmGems = { module = "org.asciidoctor:asciidoctor-gradle-jvm-gems", version.ref= "asciidoctor" }
|
||||
asciidoctorGradleJvm = { module = "org.asciidoctor:asciidoctor-gradle-jvm", version.ref= "asciidoctor" }
|
||||
|
||||
@@ -2,8 +2,10 @@ package de.thpeetz.kontor.comics.data;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
|
||||
import de.thpeetz.kontor.common.data.AbstractEntity;
|
||||
import io.micrometer.common.lang.Nullable;
|
||||
import de.thpeetz.kontor.common.data.*;
|
||||
import io.hypersistence.utils.hibernate.type.basic.YearMonthDateType;
|
||||
import jakarta.annotation.Nullable;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.JoinColumn;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
@@ -13,6 +15,9 @@ import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
import org.hibernate.annotations.Type;
|
||||
|
||||
import java.time.YearMonth;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@@ -42,6 +47,14 @@ public class Issue extends AbstractEntity {
|
||||
@NotEmpty
|
||||
private String issueNumber;
|
||||
|
||||
@Nullable
|
||||
private String title;
|
||||
|
||||
@Nullable
|
||||
@Type(YearMonthDateType.class)
|
||||
@Column(name = "published_on", columnDefinition = "date")
|
||||
private YearMonth publishedOn;
|
||||
|
||||
private Boolean isRead;
|
||||
|
||||
private Boolean inStock;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package de.thpeetz.kontor.comics.views;
|
||||
|
||||
import java.time.*;
|
||||
import java.time.format.*;
|
||||
import java.util.List;
|
||||
|
||||
import com.vaadin.flow.component.ComponentEvent;
|
||||
@@ -9,12 +11,13 @@ 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.BeanValidationBinder;
|
||||
import com.vaadin.flow.data.binder.Binder;
|
||||
import com.vaadin.flow.data.binder.*;
|
||||
|
||||
import com.vaadin.flow.data.converter.*;
|
||||
import de.thpeetz.kontor.comics.data.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@@ -24,6 +27,8 @@ public class IssueForm extends FormLayout {
|
||||
ComboBox<Comic> comic = new ComboBox<>("Comic");
|
||||
ComboBox<Volume> volume = new ComboBox<>("Volume");
|
||||
TextField issueNumber = new TextField("Issue number");
|
||||
TextField title = new TextField("Full Title");
|
||||
TextField publishedOn = new TextField("Published");
|
||||
Checkbox isRead = new Checkbox("Read");
|
||||
Checkbox inStock = new Checkbox("In stock");
|
||||
|
||||
@@ -35,11 +40,28 @@ public class IssueForm extends FormLayout {
|
||||
|
||||
public IssueForm(List<Comic> comics) {
|
||||
addClassName("issue-form");
|
||||
binder.forField(publishedOn).withConverter(new Converter<String, YearMonth>() {
|
||||
@Override
|
||||
public Result<YearMonth> 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.bindInstanceFields(this);
|
||||
|
||||
comic.setItems(comics);
|
||||
comic.setItemLabelGenerator(Comic::getTitle);
|
||||
add(comic, volume, issueNumber, isRead, inStock, createButtonsLayout());
|
||||
add(comic, volume, issueNumber, title, publishedOn, isRead, inStock, createButtonsLayout());
|
||||
}
|
||||
|
||||
private HorizontalLayout createButtonsLayout() {
|
||||
|
||||
@@ -53,6 +53,10 @@ public class IssueView extends VerticalLayout {
|
||||
.setHeader("Volume").setResizable(true).setSortable(true);
|
||||
Grid.Column<Issue> issueNumberColumn = grid.addColumn(Issue::getIssueNumber)
|
||||
.setHeader("Heft Nummer").setResizable(true).setSortable(true);
|
||||
Grid.Column<Issue> issueTitleColumn = grid.addColumn(Issue::getTitle)
|
||||
.setHeader("Full Title").setResizable(true).setSortable(true);
|
||||
Grid.Column<Issue> publishedOncolumn = grid.addColumn(Issue::getPublishedOn)
|
||||
.setHeader("Published").setResizable(true).setSortable(true);
|
||||
Grid.Column<Issue> isReadColumn = grid.addComponentColumn(issueColumn -> StatusIcon.create(issueColumn.getIsRead()))
|
||||
.setHeader("Gelesen?").setWidth("6rem").setSortable(true);
|
||||
Grid.Column<Issue> inStockColumn = grid.addComponentColumn(issueColumn -> StatusIcon.create(issueColumn.getInStock()))
|
||||
@@ -126,6 +130,8 @@ public class IssueView extends VerticalLayout {
|
||||
columnToggleContextMenu.addColumnToggleItem(titleColumn);
|
||||
columnToggleContextMenu.addColumnToggleItem(volumeColumn);
|
||||
columnToggleContextMenu.addColumnToggleItem(issueNumberColumn);
|
||||
columnToggleContextMenu.addColumnToggleItem(issueTitleColumn);
|
||||
columnToggleContextMenu.addColumnToggleItem(publishedOncolumn);
|
||||
columnToggleContextMenu.addColumnToggleItem(isReadColumn);
|
||||
columnToggleContextMenu.addColumnToggleItem(inStockColumn);
|
||||
HorizontalLayout toolbar = new HorizontalLayout(comicFilter, addIssueButton, menuButton);
|
||||
|
||||
@@ -5,7 +5,6 @@ import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import de.thpeetz.kontor.admin.data.MetaDataTable;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@@ -177,7 +176,7 @@ public class SportService {
|
||||
}
|
||||
|
||||
private String updateSportFields(Sport sport, Map<String, String> fields) {
|
||||
String status = "";
|
||||
StringBuilder status = new StringBuilder();
|
||||
for (Map.Entry<String, String> entry : fields.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
String value = entry.getValue();
|
||||
@@ -185,11 +184,11 @@ public class SportService {
|
||||
case "id", "created_date", "last_modified_date", "version":
|
||||
break;
|
||||
case "table_name":
|
||||
status += sport.updateName(value);
|
||||
status.append(sport.updateName(value));
|
||||
default:
|
||||
log.info("field {} is unknown for table {}", key, sport.getClass().getName());
|
||||
}
|
||||
}
|
||||
return status;
|
||||
return status.toString();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user