From b51329cdfaa6f10cbae2537230b675ffc34e33ce Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Fri, 1 Mar 2024 22:39:14 +0100 Subject: [PATCH] Excel export for Partners, view headers style changed --- .../src/main/resources/application-dev.yaml | 13 ++-- sly-crm-ui/pom.xml | 6 ++ .../user/lis/ui/data/PartnersDataModel.java | 22 +++++- .../lis/ui/data/common/CachedDataModel.java | 68 +++++++++++++++++-- .../ui/data/common/IDataHeaderProvider.java | 7 ++ .../lis/ui/data/common/IRowDataProvider.java | 7 ++ .../properties/ApplicationUIProperties.java | 1 + .../user/lis/ui/view/PartnersViewModel.java | 5 ++ .../src/main/resources/web/associates.zul | 17 ++--- .../resources/web/editor/project-editor.zul | 6 +- .../resources/web/import-invoices-approve.zul | 7 +- .../resources/web/import-invoices-assign.zul | 7 +- .../web/import-invoices-suspended.zul | 6 +- .../main/resources/web/invoice-payment.zul | 4 +- .../src/main/resources/web/invoices.zul | 9 ++- .../src/main/resources/web/partners.zul | 30 ++++---- .../src/main/resources/web/projects.zul | 7 +- .../main/resources/web/service-records.zul | 16 +++-- .../src/main/resources/web/settings.zul | 6 +- .../resources/web/static/css/webclient.css | 3 + 20 files changed, 179 insertions(+), 68 deletions(-) create mode 100644 sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/IDataHeaderProvider.java create mode 100644 sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/IRowDataProvider.java diff --git a/sly-crm-app/src/main/resources/application-dev.yaml b/sly-crm-app/src/main/resources/application-dev.yaml index 5fc5748..1b0d776 100644 --- a/sly-crm-app/src/main/resources/application-dev.yaml +++ b/sly-crm-app/src/main/resources/application-dev.yaml @@ -20,12 +20,12 @@ spring: enabled: always datasource: type: com.zaxxer.hikari.HikariDataSource - url: jdbc:db2://localhost:50000/slycrm + # url: jdbc:db2://localhost:50000/slycrm + # username: db2admin + # password: password + url: jdbc:db2://db2.in.useribm.hu:50000/slycrm username: db2admin - password: password -# url: jdbc:db2://db2.in.useribm.hu:50000/slycrm -# username: db2admin -# password: Passw@rd01 + password: Passw@rd01 camunda.bpm: generic-properties.properties: telemetry-reporter-activate: false @@ -59,7 +59,8 @@ application: ui: user-name: user password: password - # disable-profile-save: true + export-temp-path: /temp + disable-profile-save: true workflow: import-invoice: input-path: /temp/invoice-import diff --git a/sly-crm-ui/pom.xml b/sly-crm-ui/pom.xml index 55f14c1..e2ab68e 100644 --- a/sly-crm-ui/pom.xml +++ b/sly-crm-ui/pom.xml @@ -127,5 +127,11 @@ sly-crm-workflow 0.0.1-SNAPSHOT + + + org.dhatim + fastexcel + 0.15.0 + \ No newline at end of file diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/PartnersDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/PartnersDataModel.java index 8333d8f..7c7885e 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/PartnersDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/PartnersDataModel.java @@ -5,6 +5,8 @@ import hu.user.lis.db.repository.PartnerRepository; import hu.user.lis.service.data.EntityDataService; import hu.user.lis.service.data.PartnerService; import hu.user.lis.ui.data.common.CachedSpringDataModel; +import hu.user.lis.ui.data.common.IDataHeaderProvider; +import hu.user.lis.ui.data.common.IRowDataProvider; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; @@ -18,7 +20,7 @@ import java.util.List; @Component @Log4j2 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class PartnersDataModel extends CachedSpringDataModel { +public class PartnersDataModel extends CachedSpringDataModel implements IDataHeaderProvider, IRowDataProvider { @Autowired PartnerRepository partnerRepository; @@ -91,4 +93,22 @@ public class PartnersDataModel extends CachedSpringDataModel { public void delete(Partner selectedEntity) { partnerRepository.delete(selectedEntity); } + + public void export() { + super.export("partners", this, this); + } + + @Override + public String[] mapHeaders() { + return new String[]{ + "Név", "Adószám", "Cím", "Aktív" + }; + } + + @Override + public String[] mapRowData(Partner data) { + return new String[]{ + data.getName(), data.getVatNr(), data.getAddress(), String.valueOf(data.isActive()) + }; + } } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/CachedDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/CachedDataModel.java index 8d07b12..f0195c6 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/CachedDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/CachedDataModel.java @@ -1,31 +1,53 @@ package hu.user.lis.ui.data.common; +import hu.user.lis.ui.properties.ApplicationUIProperties; import lombok.Setter; import lombok.extern.log4j.Log4j2; +import org.dhatim.fastexcel.Workbook; +import org.dhatim.fastexcel.Worksheet; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.zkoss.bind.BindUtils; import org.zkoss.zul.FieldComparator; +import org.zkoss.zul.Filedownload; import org.zkoss.zul.ListModelList; import org.zkoss.zul.event.ListDataEvent; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Comparator; import java.util.HashMap; import java.util.List; -@Component @Log4j2 +@Component public abstract class CachedDataModel extends ListModelList { public static final String NATURAL = "natural"; + public static final String ASCENDING = "ascending"; + public static final String DESCENDING = "descending"; - private int CACHE_SIZE = 100; + + private final int CACHE_SIZE = 100; + + private final HashMap cache = new HashMap<>(); + private int cacheStart; + private int cacheEnd; + private int resultSetSize = -1; - private HashMap cache = new HashMap<>(); + @Setter private FieldComparator sortComparator; + @Autowired + private ApplicationUIProperties applicationUIProperties; + public CachedDataModel() { setMultiple(false); @@ -166,8 +188,46 @@ public abstract class CachedDataModel extends ListModelList { @Override public void sort(Comparator cmpr, boolean ascending) { sortComparator = (FieldComparator) cmpr; -// log.info("Sort {} {}", sortComparator.getOrderBy(), ascending); reset(); } + + public Path export(String name, IDataHeaderProvider headerProvider, IRowDataProvider rowDataProvider) { + String timestamp = DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss").format(LocalDateTime.now()); + Path result = Paths.get(applicationUIProperties.getExportTempPath(), String.format("%s-%s.xlsx", name, timestamp)); + int resultSetCount = getResultSetCount(); + if (resultSetCount == 0) { + return null; + } + int pageCount = resultSetCount / CACHE_SIZE; + if (resultSetCount % CACHE_SIZE > 0) { + pageCount++; + } + int row = 0; + try (OutputStream os = Files.newOutputStream(result)) { + Workbook wb = new Workbook(os, "SLY-CRM", "1.0"); + Worksheet ws = wb.newWorksheet("Sheet 1"); + String[] headers = headerProvider.mapHeaders(); + for (int h = 0; h < headers.length; h++) { + ws.value(row, h, headers[h]); + } + for (int i = 0; i < pageCount; i++) { + List datas = getResultSet(i, CACHE_SIZE, sortComparator); + log.info("Got {} records", datas.size()); + for (T data : datas) { + String[] rowData = rowDataProvider.mapRowData(data); + row++; + for (int o = 0; o < rowData.length; o++) { + ws.value(row, o, rowData[o]); + } + } + } + wb.finish(); + + Filedownload.save(result.toFile(), "application/vnd.ms-excel"); + } catch (Exception e) { + log.error(e.getMessage()); + } + return result; + } } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/IDataHeaderProvider.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/IDataHeaderProvider.java new file mode 100644 index 0000000..f10ec93 --- /dev/null +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/IDataHeaderProvider.java @@ -0,0 +1,7 @@ +package hu.user.lis.ui.data.common; + +public interface IDataHeaderProvider { + + String[] mapHeaders(); + +} diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/IRowDataProvider.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/IRowDataProvider.java new file mode 100644 index 0000000..ef68d3e --- /dev/null +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/IRowDataProvider.java @@ -0,0 +1,7 @@ +package hu.user.lis.ui.data.common; + +public interface IRowDataProvider { + + String[] mapRowData(T data); + +} diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/properties/ApplicationUIProperties.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/properties/ApplicationUIProperties.java index 9299b29..9df3973 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/properties/ApplicationUIProperties.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/properties/ApplicationUIProperties.java @@ -17,4 +17,5 @@ public class ApplicationUIProperties { private boolean disableProfileSave; + private String exportTempPath; } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java index 87e15b9..e66457d 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java @@ -86,4 +86,9 @@ public class PartnersViewModel extends FilterActiveViewModel { } }); } + + @Command + public void onExport() { + partnersDataModel.export(); + } } diff --git a/sly-crm-ui/src/main/resources/web/associates.zul b/sly-crm-ui/src/main/resources/web/associates.zul index 5dc4a87..3263382 100644 --- a/sly-crm-ui/src/main/resources/web/associates.zul +++ b/sly-crm-ui/src/main/resources/web/associates.zul @@ -1,5 +1,3 @@ - - @@ -8,16 +6,19 @@ - + + diff --git a/sly-crm-ui/src/main/resources/web/editor/project-editor.zul b/sly-crm-ui/src/main/resources/web/editor/project-editor.zul index aa366c1..565d4f5 100644 --- a/sly-crm-ui/src/main/resources/web/editor/project-editor.zul +++ b/sly-crm-ui/src/main/resources/web/editor/project-editor.zul @@ -2,7 +2,11 @@ - + + + +
diff --git a/sly-crm-ui/src/main/resources/web/import-invoices-approve.zul b/sly-crm-ui/src/main/resources/web/import-invoices-approve.zul index a66489e..5ca445d 100644 --- a/sly-crm-ui/src/main/resources/web/import-invoices-approve.zul +++ b/sly-crm-ui/src/main/resources/web/import-invoices-approve.zul @@ -2,16 +2,15 @@ - + + - diff --git a/sly-crm-ui/src/main/resources/web/import-invoices-assign.zul b/sly-crm-ui/src/main/resources/web/import-invoices-assign.zul index fec78df..8f577ef 100644 --- a/sly-crm-ui/src/main/resources/web/import-invoices-assign.zul +++ b/sly-crm-ui/src/main/resources/web/import-invoices-assign.zul @@ -2,16 +2,15 @@ - + + - diff --git a/sly-crm-ui/src/main/resources/web/import-invoices-suspended.zul b/sly-crm-ui/src/main/resources/web/import-invoices-suspended.zul index 9cc8a19..f4e3464 100644 --- a/sly-crm-ui/src/main/resources/web/import-invoices-suspended.zul +++ b/sly-crm-ui/src/main/resources/web/import-invoices-suspended.zul @@ -2,13 +2,13 @@ - + + diff --git a/sly-crm-ui/src/main/resources/web/invoice-payment.zul b/sly-crm-ui/src/main/resources/web/invoice-payment.zul index 396b02e..b2ad8ac 100644 --- a/sly-crm-ui/src/main/resources/web/invoice-payment.zul +++ b/sly-crm-ui/src/main/resources/web/invoice-payment.zul @@ -10,9 +10,9 @@ - + + diff --git a/sly-crm-ui/src/main/resources/web/invoices.zul b/sly-crm-ui/src/main/resources/web/invoices.zul index 42b9d68..1dd314b 100644 --- a/sly-crm-ui/src/main/resources/web/invoices.zul +++ b/sly-crm-ui/src/main/resources/web/invoices.zul @@ -6,9 +6,9 @@ - + + - @@ -65,7 +64,7 @@ onClick="@command('setIncoming', incoming=false)"/> - + diff --git a/sly-crm-ui/src/main/resources/web/partners.zul b/sly-crm-ui/src/main/resources/web/partners.zul index 8d02a09..7c54a3e 100644 --- a/sly-crm-ui/src/main/resources/web/partners.zul +++ b/sly-crm-ui/src/main/resources/web/partners.zul @@ -1,9 +1,9 @@ - + + @@ -38,20 +38,6 @@ - - - - - - - - - - - - - - @@ -74,7 +60,15 @@ - + + + + + +
diff --git a/sly-crm-ui/src/main/resources/web/projects.zul b/sly-crm-ui/src/main/resources/web/projects.zul index 90caacc..012746e 100644 --- a/sly-crm-ui/src/main/resources/web/projects.zul +++ b/sly-crm-ui/src/main/resources/web/projects.zul @@ -1,9 +1,9 @@ - + + - diff --git a/sly-crm-ui/src/main/resources/web/service-records.zul b/sly-crm-ui/src/main/resources/web/service-records.zul index fb66a7f..7e4af83 100644 --- a/sly-crm-ui/src/main/resources/web/service-records.zul +++ b/sly-crm-ui/src/main/resources/web/service-records.zul @@ -2,18 +2,20 @@ - + + - diff --git a/sly-crm-ui/src/main/resources/web/settings.zul b/sly-crm-ui/src/main/resources/web/settings.zul index 956e685..d067e5a 100644 --- a/sly-crm-ui/src/main/resources/web/settings.zul +++ b/sly-crm-ui/src/main/resources/web/settings.zul @@ -1,6 +1,10 @@ - + + + + diff --git a/sly-crm-ui/src/main/resources/web/static/css/webclient.css b/sly-crm-ui/src/main/resources/web/static/css/webclient.css index 65393ac..e1aee26 100644 --- a/sly-crm-ui/src/main/resources/web/static/css/webclient.css +++ b/sly-crm-ui/src/main/resources/web/static/css/webclient.css @@ -1,3 +1,6 @@ +.z-caption-content { + width: 100% +} .number-box { text-align: right; width: 100px; -- 2.54.0