diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java index 48fd4c4..6b736b9 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java @@ -22,6 +22,7 @@ import com.vaadin.data.provider.DataCommunicator; import com.vaadin.data.provider.Query; import com.vaadin.ui.Grid; +import com.vaadin.ui.Grid.Column; public abstract class FileBuilder { private static final String TMP_FILE_NAME = "tmp"; @@ -36,8 +37,7 @@ public abstract class FileBuilder { FileBuilder(Grid grid, ExporterOption option) { this.grid = Objects.requireNonNull(grid); this.option = Objects.requireNonNull(option); - - columns = grid.getColumns().stream().filter(this::isExportable).collect(Collectors.toList()); + columns = grid.getColumns().stream().filter(this::isColumnExportable).collect(Collectors.toList()); if (columns.isEmpty()) { throw new ExporterException( "No exportable column found, did you remember to set property name as the key for column"); @@ -45,7 +45,7 @@ public abstract class FileBuilder { } - private boolean isExportable(Grid.Column column) { + private boolean isColumnExportable(Grid.Column column) { if (column.isHidden()) { return false; } @@ -58,20 +58,6 @@ private boolean isExportable(Grid.Column column) { return false; } - if (option.isUseItemProperties()) { - if (propertySet == null) { - return false; - } - - if (!propertySet.getProperty(column.getId()).isPresent()) { - return false; - } - } - - if (!option.getColumnOption(column.getId()).getValueProviderFunction().isPresent()) { - return false; - } - return true; } @@ -104,8 +90,11 @@ protected void resetContent() { private void buildHeaderRow() { columns.forEach(column -> { - if (option.isUseItemProperties()) { - Optional> propertyDefinition = propertySet.getProperty(column.getId()); + if (getColumnOption(column).getHeaderProviderFunction().isPresent()) { + onNewCell(); + buildColumnHeaderCell(getColumnOption(column).getHeaderProviderFunction().get().apply(column.getId())); + } else { + Optional> propertyDefinition = propertySet.getProperty(column.getId()); if (propertyDefinition.isPresent()) { onNewCell(); buildColumnHeaderCell(getColumnHeader(propertyDefinition.get())); @@ -113,14 +102,7 @@ private void buildHeaderRow() { LoggerFactory.getLogger(this.getClass()) .warn(String.format("Column id %s is a property which cannot be found", column.getId())); } - } else { - ColumnOption columnOption = option.getColumnOption(column.getId()); - columnOption.getHeaderProviderFunction().ifPresent(headerProvider -> { - String header = headerProvider.apply(column.getId()); - onNewCell(); - buildCell(header); - }); - } + } }); headerRowBuilt = true; @@ -165,19 +147,18 @@ private void buildRows() { @SuppressWarnings("unchecked") private void buildRow(T item) { - if (option.isUseItemProperties() && propertySet == null) { + if (propertySet == null) { propertySet = (PropertySet) BeanPropertySet.get(item.getClass()); - columns = columns.stream().filter(this::isExportable).collect(Collectors.toList()); } + if (!headerRowBuilt) { buildHeaderRow(); onNewRow(); } columns.forEach(column -> { - ColumnOption columnOption = option.getColumnOption(column.getId()); - Optional> getterFunction = columnOption.getValueProviderFunction(); - if (getterFunction.isPresent()) { - Object value = getterFunction.get().apply(item); + Optional> optionalGetter = getColumnOption(column).getValueProviderFunction(); + if (optionalGetter.isPresent()) { + Object value = optionalGetter.get().apply(item); onNewCell(); buildCell(value); } else { @@ -187,12 +168,16 @@ private void buildRow(T item) { buildCell(propertyDefinition.get().getGetter().apply(item)); } else { throw new ExporterException( - "Column id: " + column.getId() + " is a property which cannot be found"); + "Property for column id: " + column.getId() + " cannot be found"); } } }); } + private ColumnOption getColumnOption(Column column) { + return option.getColumnOption(column.getId()); + } + void onNewRow() { } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java b/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java index 73553c3..149a8bb 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java @@ -3,27 +3,28 @@ import java.util.HashMap; import java.util.Map; +import com.vaadin.ui.Grid.Column; + public class ExporterOption { private Map columnOptions; - private boolean useItemProperties; + /** + * If does not exist empty {@linkplain ColumnOption option} will be created for given ID. + * + * @param columnKey use column {@link Column#getId() ID} + */ public ColumnOption getColumnOption(String columnKey) { getColumnOptions().putIfAbsent(columnKey, new ColumnOption()); return getColumnOptions().get(columnKey); } + /** + * @return Column mapped by {@link Column#getId() ID} + */ private Map getColumnOptions() { if (columnOptions == null) { columnOptions = new HashMap<>(); } return columnOptions; } - - public boolean isUseItemProperties() { - return useItemProperties; - } - - public void setUseItemProperties(boolean useItemProperties) { - this.useItemProperties = useItemProperties; - } } diff --git a/exporter-demo/.gitignore b/exporter-demo/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/exporter-demo/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/exporter-demo/pom.xml b/exporter-demo/pom.xml index 63fd460..36de46a 100644 --- a/exporter-demo/pom.xml +++ b/exporter-demo/pom.xml @@ -85,6 +85,10 @@ 3.0.1 provided + + com.vaadin + vaadin-server + diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/DemoUI.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/DemoUI.java index e2b1264..6c900d0 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/DemoUI.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/DemoUI.java @@ -1,4 +1,4 @@ -package org.vaadin.addons.demo; +package org.vaadin.haijian.demo; import com.vaadin.annotations.Theme; import com.vaadin.annotations.Title; @@ -6,10 +6,11 @@ import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinServlet; import com.vaadin.ui.*; -import org.vaadin.addons.demo.helpers.GridDemoViewCreator; import javax.servlet.annotation.WebServlet; +import org.vaadin.haijian.demo.helpers.GridDemoViewCreator; + @Theme("valo") @Title("Exporter Add-on Demo") @SuppressWarnings("serial") diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/AgeGroup.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/AgeGroup.java index 993959d..d19c185 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/AgeGroup.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/AgeGroup.java @@ -1,4 +1,4 @@ -package org.vaadin.addons.demo.helpers; +package org.vaadin.haijian.demo.helpers; public class AgeGroup { diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java index 433f292..0615f9e 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java @@ -1,5 +1,6 @@ -package org.vaadin.addons.demo.helpers; +package org.vaadin.haijian.demo.helpers; +import com.vaadin.data.ValueProvider; import com.vaadin.data.provider.CallbackDataProvider; import com.vaadin.data.provider.ConfigurableFilterDataProvider; import com.vaadin.data.provider.DataProvider; @@ -69,7 +70,8 @@ private static Component createGridDemo(boolean lazyLoading) { ExporterOption exporterOption = new ExporterOption(); exporterOption.getColumnOption("name").columnName("My Name").toUpperCase(); exporterOption.getColumnOption("email").columnName("My Email"); - exporterOption.getColumnOption("age").toUpperCase(); + exporterOption.getColumnOption("age").headerProviderFunction(value -> "Current " + value + " x10"); + exporterOption.getColumnOption("age").valueProviderFunction(source -> {return (int) ((Person)source).getAge() * 10;}); StreamResource excelStreamResourceWithCustomHeader = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsExcel(grid, exporterOption), "my-excel-with-cutom-header.xlsx"); FileDownloader excelFileDownloaderWithCustomHeader = new FileDownloader(excelStreamResourceWithCustomHeader); diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/Person.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/Person.java index 9139bd2..1ef4272 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/Person.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/Person.java @@ -1,4 +1,4 @@ -package org.vaadin.addons.demo.helpers; +package org.vaadin.haijian.demo.helpers; import java.time.LocalDate; diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/PersonService.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/PersonService.java index d1aec64..5f9cf81 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/PersonService.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/PersonService.java @@ -1,4 +1,4 @@ -package org.vaadin.addons.demo.helpers; +package org.vaadin.haijian.demo.helpers; import com.vaadin.data.provider.QuerySortOrder; import com.vaadin.shared.data.sort.SortDirection;