From: elgekko Date: Mon, 17 Apr 2023 20:55:21 +0000 (+0200) Subject: Projects list, project editor added partial implementation X-Git-Url: http://git.useribm.hu/?a=commitdiff_plain;h=4285bd6d522c5d9711d7375c55a635c226f4fafd;p=sly-crm.git Projects list, project editor added partial implementation --- diff --git a/lis-app/pom.xml b/lis-app/pom.xml index 24ffec7..d6c5c54 100644 --- a/lis-app/pom.xml +++ b/lis-app/pom.xml @@ -4,7 +4,7 @@ 4.0.0 hu.user lis-app - 0.0.2-SNAPSHOT + 0.0.3-SNAPSHOT hu.user lis diff --git a/lis-db/src/main/java/hu/user/lis/db/Currency.java b/lis-db/src/main/java/hu/user/lis/db/Currency.java new file mode 100644 index 0000000..ac32550 --- /dev/null +++ b/lis-db/src/main/java/hu/user/lis/db/Currency.java @@ -0,0 +1,5 @@ +package hu.user.lis.db; + +public enum Currency { + HUF, USD, EURO +} diff --git a/lis-db/src/main/java/hu/user/lis/db/Invoice.java b/lis-db/src/main/java/hu/user/lis/db/Invoice.java new file mode 100644 index 0000000..851c605 --- /dev/null +++ b/lis-db/src/main/java/hu/user/lis/db/Invoice.java @@ -0,0 +1,25 @@ +package hu.user.lis.db; + +import lombok.*; + +import java.time.LocalDate; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Invoice { + String id; + String projectId; + String title; + Partner partner; + boolean income; + Currency currency; + double netAmount; + double grossAmount; + double vatAmount; + LocalDate completionDate; + LocalDate createDate; + LocalDate paymentDeadline; +} diff --git a/lis-db/src/main/java/hu/user/lis/db/Project.java b/lis-db/src/main/java/hu/user/lis/db/Project.java new file mode 100644 index 0000000..42817d3 --- /dev/null +++ b/lis-db/src/main/java/hu/user/lis/db/Project.java @@ -0,0 +1,17 @@ +package hu.user.lis.db; + +import lombok.*; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Project { + String id; + String name; + String humanId; + String contactName; + Partner partner; + boolean active; +} diff --git a/lis-services/src/main/java/hu/user/lis/services/data/DataGeneratorService.java b/lis-services/src/main/java/hu/user/lis/services/data/DataGeneratorService.java new file mode 100644 index 0000000..a89356c --- /dev/null +++ b/lis-services/src/main/java/hu/user/lis/services/data/DataGeneratorService.java @@ -0,0 +1,14 @@ +package hu.user.lis.services.data; + +import com.github.javafaker.Faker; +import org.springframework.stereotype.Service; + +@Service +public class DataGeneratorService { + private Faker faker = new Faker(); + + public Faker faker() { + return faker; + } + +} diff --git a/lis-services/src/main/java/hu/user/lis/services/data/InvoiceService.java b/lis-services/src/main/java/hu/user/lis/services/data/InvoiceService.java new file mode 100644 index 0000000..06eff52 --- /dev/null +++ b/lis-services/src/main/java/hu/user/lis/services/data/InvoiceService.java @@ -0,0 +1,18 @@ +package hu.user.lis.services.data; + +import com.fasterxml.jackson.core.JsonProcessingException; +import hu.user.lis.db.Invoice; + +import java.util.List; + +public interface InvoiceService { + List getAll(); + + Invoice createNew(); + + void add(Invoice entity); + + Invoice copy(Invoice sourceEntity) throws JsonProcessingException; + + void replace(Invoice targetEntity, Invoice replacementEntity); +} diff --git a/lis-services/src/main/java/hu/user/lis/services/data/InvoiceServiceImpl.java b/lis-services/src/main/java/hu/user/lis/services/data/InvoiceServiceImpl.java new file mode 100644 index 0000000..b7eaa50 --- /dev/null +++ b/lis-services/src/main/java/hu/user/lis/services/data/InvoiceServiceImpl.java @@ -0,0 +1,65 @@ +package hu.user.lis.services.data; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import hu.user.lis.db.Invoice; +import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class InvoiceServiceImpl implements InvoiceService { + private List entities; + @Autowired + DataGeneratorService dataGeneratorService; + + @Autowired + ObjectMapper mapper; + + @Override + public List getAll() { + if (entities == null) { + entities = generate(); + } + return entities; + } + + @Override + public Invoice createNew() { + String id = RandomStringUtils.random(8, "0123456789abcdef"); + return Invoice.builder().id(id).build(); + } + + @Override + public void add(Invoice entity) { + entities.add(entity); + } + + @Override + public Invoice copy(Invoice sourceEntity) throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + String json = mapper.writeValueAsString(sourceEntity); + return mapper.readValue(json, Invoice.class); + } + + @Override + public void replace(Invoice targetEntity, Invoice replacementEntity) { + Invoice listEntity = entities.stream().filter(p -> p.getId().equals(targetEntity.getId())).findFirst().get(); + entities.remove(listEntity); + entities.add(replacementEntity); + } + + private List generate() { + List result = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + String id = RandomStringUtils.random(8, "0123456789abcdef"); + String title = dataGeneratorService.faker().commerce().productName(); + Invoice entity = Invoice.builder().id(id).title(title).build(); + result.add(entity); + } + return result; + } +} diff --git a/lis-services/src/main/java/hu/user/lis/services/data/PartnerService.java b/lis-services/src/main/java/hu/user/lis/services/data/PartnerService.java index 48c801a..0f1b02a 100644 --- a/lis-services/src/main/java/hu/user/lis/services/data/PartnerService.java +++ b/lis-services/src/main/java/hu/user/lis/services/data/PartnerService.java @@ -10,9 +10,11 @@ public interface PartnerService { Partner createNew(); - void add(Partner partner); + void add(Partner entity); - Partner copy(Partner selectedPartner) throws JsonProcessingException; + Partner copy(Partner sourceEntity) throws JsonProcessingException; - void replace(Partner selectedPartner, Partner editPartner); + void replace(Partner targetEntity, Partner replacementEntity); + + Partner getRandom(); } diff --git a/lis-services/src/main/java/hu/user/lis/services/data/PartnerServiceImpl.java b/lis-services/src/main/java/hu/user/lis/services/data/PartnerServiceImpl.java index dc59f2b..ae99f3f 100644 --- a/lis-services/src/main/java/hu/user/lis/services/data/PartnerServiceImpl.java +++ b/lis-services/src/main/java/hu/user/lis/services/data/PartnerServiceImpl.java @@ -2,9 +2,10 @@ package hu.user.lis.services.data; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.javafaker.Faker; +import com.github.javafaker.Address; import hu.user.lis.db.Partner; import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.RandomUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -13,17 +14,19 @@ import java.util.List; @Service public class PartnerServiceImpl implements PartnerService { - private List partners; + private List entities; @Autowired ObjectMapper mapper; + @Autowired + DataGeneratorService dataGeneratorService; @Override public List getAll() { - if (partners == null) { - partners = generate(); + if (entities == null) { + entities = generate(); } - return partners; + return entities; } @Override @@ -33,35 +36,42 @@ public class PartnerServiceImpl implements PartnerService { } @Override - public void add(Partner partner) { - partners.add(partner); + public void add(Partner entity) { + entities.add(entity); } @Override - public Partner copy(Partner selectedPartner) throws JsonProcessingException { + public Partner copy(Partner sourceEntity) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); - String json = mapper.writeValueAsString(selectedPartner); + String json = mapper.writeValueAsString(sourceEntity); return mapper.readValue(json, Partner.class); } @Override - public void replace(Partner selectedPartner, Partner editPartner) { - Partner partnerInList = partners.stream().filter(p -> p.getId().equals(selectedPartner.getId())).findFirst().get(); - partners.remove(partnerInList); - //partners.remove(selectedPartner); - partners.add(editPartner); + public void replace(Partner targetEntity, Partner replacementEntity) { + Partner listEntity = entities.stream().filter(p -> p.getId().equals(targetEntity.getId())).findFirst().get(); + entities.remove(listEntity); + entities.add(replacementEntity); + } + + @Override + public Partner getRandom() { + return getAll().get(RandomUtils.nextInt(0, entities.size())); } private List generate() { List result = new ArrayList<>(); - Faker faker = new Faker(); for (int i = 0; i < 100; i++) { String id = RandomStringUtils.random(8, "0123456789abcdef"); - String name = faker.name().fullName(); + String name = dataGeneratorService.faker().name().fullName(); String vatNr = RandomStringUtils.random(12, "0123456789"); - String address = String.format("%s %s, %s street %s", faker.address().zipCode(), faker.address().city(), - faker.address().streetName(), faker.address().buildingNumber()); - Partner partner = Partner.builder().active(true).id(id).name(name).vatNr(vatNr).address(address).build(); + Address address = dataGeneratorService.faker().address(); + String fullAddress = String.format("%s %s, %s street %s", + address.zipCode(), + address.city(), + address.streetName(), + address.buildingNumber()); + Partner partner = Partner.builder().active(true).id(id).name(name).vatNr(vatNr).address(fullAddress).build(); result.add(partner); } return result; diff --git a/lis-services/src/main/java/hu/user/lis/services/data/ProjectService.java b/lis-services/src/main/java/hu/user/lis/services/data/ProjectService.java new file mode 100644 index 0000000..261ef91 --- /dev/null +++ b/lis-services/src/main/java/hu/user/lis/services/data/ProjectService.java @@ -0,0 +1,18 @@ +package hu.user.lis.services.data; + +import com.fasterxml.jackson.core.JsonProcessingException; +import hu.user.lis.db.Project; + +import java.util.List; + +public interface ProjectService { + List getAll(); + + Project createNew(); + + void add(Project entity); + + Project copy(Project sourceEntity) throws JsonProcessingException; + + void replace(Project targetEntity, Project replacementEntity); +} diff --git a/lis-services/src/main/java/hu/user/lis/services/data/ProjectServiceImpl.java b/lis-services/src/main/java/hu/user/lis/services/data/ProjectServiceImpl.java new file mode 100644 index 0000000..3850429 --- /dev/null +++ b/lis-services/src/main/java/hu/user/lis/services/data/ProjectServiceImpl.java @@ -0,0 +1,78 @@ +package hu.user.lis.services.data; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import hu.user.lis.db.Partner; +import hu.user.lis.db.Project; +import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ProjectServiceImpl implements ProjectService { + private List entities; + @Autowired + ObjectMapper mapper; + @Autowired + DataGeneratorService dataGeneratorService; + @Autowired + PartnerService partnerService; + + @Override + public List getAll() { + if (entities == null) { + entities = generate(); + } + return entities; + } + + @Override + public Project createNew() { + String id = RandomStringUtils.random(8, "0123456789abcdef"); + String humanId = dataGeneratorService.faker().code().isbn13(true); + return Project.builder().id(id).humanId(humanId).active(true).build(); + } + + @Override + public void add(Project entity) { + entities.add(entity); + } + + @Override + public Project copy(Project sourceEntity) throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + String json = mapper.writeValueAsString(sourceEntity); + return mapper.readValue(json, Project.class); + } + + @Override + public void replace(Project targetEntity, Project replacementEntity) { + Project partnerInList = entities.stream().filter(p -> p.getId().equals(targetEntity.getId())).findFirst().get(); + entities.remove(partnerInList); + entities.add(replacementEntity); + } + + private List generate() { + List result = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + String id = RandomStringUtils.random(8, "0123456789abcdef"); + String name = dataGeneratorService.faker().commerce().productName(); + String humanId = dataGeneratorService.faker().code().isbn10(true); + String contactName = dataGeneratorService.faker().name().fullName(); + Partner partner = partnerService.getRandom(); + Project entity = Project.builder() + .id(id) + .active(true) + .humanId(humanId) + .name(name) + .contactName(contactName) + .partner(partner) + .build(); + result.add(entity); + } + return result; + } +} diff --git a/lis-services/src/main/java/hu/user/lis/services/data/SupplierServiceImpl.java b/lis-services/src/main/java/hu/user/lis/services/data/SupplierServiceImpl.java index 57880db..3913e1c 100644 --- a/lis-services/src/main/java/hu/user/lis/services/data/SupplierServiceImpl.java +++ b/lis-services/src/main/java/hu/user/lis/services/data/SupplierServiceImpl.java @@ -1,8 +1,8 @@ package hu.user.lis.services.data; -import com.github.javafaker.Faker; import hu.user.lis.db.Supplier; import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -11,6 +11,8 @@ import java.util.List; @Service public class SupplierServiceImpl implements SupplierService { private List suppliers; + @Autowired + DataGeneratorService dataGeneratorService; @Override public List getAll() { @@ -22,10 +24,9 @@ public class SupplierServiceImpl implements SupplierService { private List generate() { List result = new ArrayList<>(); - Faker faker = new Faker(); for (int i = 0; i < 100; i++) { String id = RandomStringUtils.random(8, "0123456789abcdef"); - String name = faker.name().fullName(); + String name = dataGeneratorService.faker().name().fullName(); String zipCode = RandomStringUtils.random(4, "0123456789"); Supplier supplier = Supplier.builder().id(id).name(name).zipCode(zipCode).build(); result.add(supplier); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/converter/PartnerToNameConverter.java b/lis-ui/src/main/java/hu/user/lis/ui/converter/PartnerToNameConverter.java new file mode 100644 index 0000000..8422789 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/converter/PartnerToNameConverter.java @@ -0,0 +1,19 @@ +package hu.user.lis.ui.converter; + +import hu.user.lis.db.Partner; +import org.zkoss.bind.BindContext; +import org.zkoss.bind.Converter; +import org.zkoss.zul.Bandbox; + +public class PartnerToNameConverter implements Converter { + + @Override + public String coerceToUi(Partner partner, Bandbox bandbox, BindContext bindContext) { + return partner == null ? null : partner.getName(); + } + + @Override + public Partner coerceToBean(String s, Bandbox bandbox, BindContext bindContext) { + return null; + } +} \ No newline at end of file diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/PartnersSelectorDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/PartnersSelectorDataModel.java new file mode 100644 index 0000000..6867013 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/PartnersSelectorDataModel.java @@ -0,0 +1,60 @@ +package hu.user.lis.ui.data; + +import hu.user.lis.db.Partner; +import hu.user.lis.services.data.PartnerService; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.zkoss.bind.BindUtils; +import org.zkoss.zul.FieldComparator; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +@Component +@Log4j2 +public class PartnersSelectorDataModel extends CachedDataModel { + static private final int SEARCH_LIMIT = 10; + private String partialName; + @Autowired + PartnerService partnerService; + + private boolean filter(Partner partner) { + if (StringUtils.isBlank(partialName)) { + return true; + } else { + if (partner.getName().toLowerCase().startsWith(partialName.toLowerCase())) { + return true; + } + } + return false; + } + + @Override + protected List getResultSet(long offset, int limit, FieldComparator sortComparator) { + List result = partnerService.getAll().stream() + .sorted(Comparator.comparing(Partner::getName)) + .filter(s -> filter(s)) + .limit(SEARCH_LIMIT) + .collect(Collectors.toList()); + return result; + } + + @Override + public int getResultSetCount() { + int result = (int) partnerService.getAll().stream() + .filter(s -> filter(s)) + .limit(SEARCH_LIMIT) + .count(); + return result; + } + + public void search(String partialName) { + log.info("Searching partner using filter {}", partialName); + this.partialName = partialName; + super.reset(); + BindUtils.postNotifyChange(null, null, this, "*"); + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java new file mode 100644 index 0000000..f75278c --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java @@ -0,0 +1,116 @@ +package hu.user.lis.ui.data; + +import hu.user.lis.db.Project; +import hu.user.lis.services.data.ProjectService; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.zkoss.bind.BindUtils; +import org.zkoss.zul.FieldComparator; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +@Component +@Log4j2 +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ProjectsDataModel extends CachedDataModel { + private String partialName; + private String partialHumanId; + private boolean listAll; + + @Getter + @Autowired + ProjectService projectService; + private boolean filterShowInActive; + private boolean filterShowActive; + + + private boolean canExecuteSearch() { + boolean result = listAll || filterShowActive || filterShowInActive || + StringUtils.isNotBlank(partialName) || + StringUtils.isNotBlank(partialHumanId); + log.info("Can execute search: {}", result); + return result; + } + + private boolean filter(Project entity) { + if (listAll) { + return true; + } + boolean result = true; + if (StringUtils.isNotBlank(partialName)) { + if (!entity.getName().toLowerCase().startsWith(partialName.toLowerCase())) { + result = false; + } + } + if (StringUtils.isNotBlank(partialHumanId)) { + if (!entity.getHumanId().toLowerCase().startsWith(partialHumanId.toLowerCase())) { + result = false; + } + } + if (!filterShowActive && entity.isActive()) { + result = false; + } + if (!filterShowInActive && !entity.isActive()) { + result = false; + } + return result; + } + + @Override + protected List getResultSet(long offset, int limit, FieldComparator sortComparator) { + List result = null; + if (canExecuteSearch()) { + result = projectService.getAll().stream() + .filter(s -> filter(s)) + .sorted(Comparator.comparing(Project::getName, String.CASE_INSENSITIVE_ORDER)) + .collect(Collectors.toList()); + } + return result; + } + + @Override + public int getResultSetCount() { + int result = 0; + if (canExecuteSearch()) { + result = (int) projectService.getAll().stream() + .filter(s -> filter(s)) + .count(); + } + return result; + } + + public void search(String partialName, String partialHumanId) { + log.info("Searching partner using filters: name LIKE {}, VAT human ID LIKE {}", + partialName, partialHumanId); + listAll = false; + this.partialName = partialName; + this.partialHumanId = partialHumanId; + super.reset(); + BindUtils.postNotifyChange(null, null, this, "*"); + } + + + public void search(boolean filterShowActive, boolean filterShowInActive) { + log.info("Searching partner using filters: filterShowActive {}, filterShowInActive {}", + filterShowActive, filterShowInActive); + this.filterShowActive = filterShowActive; + this.filterShowInActive = filterShowInActive; + listAll = false; + super.reset(); + BindUtils.postNotifyChange(null, null, this, "*"); + } + + public void listAll() { + log.info("List all partners"); + listAll = true; + super.reset(); + BindUtils.postNotifyChange(null, null, this, "*"); + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/PartnerEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/PartnerEditorModel.java index a884519..1ee5dbd 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/PartnerEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/PartnerEditorModel.java @@ -19,7 +19,6 @@ import org.zkoss.zul.Window; @Setter @VariableResolver(DelegatingVariableResolver.class) public class PartnerEditorModel { - private boolean canEdit; private Partner selectedPartner; @Init diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java index 966a306..c85abbe 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java @@ -47,6 +47,8 @@ public class PartnersViewModel extends AsyncBaseModel { } private void refresh() { + partnersDataModel.clearSelection(); + selectedPartner = null; if (filterShowBoth) { partnersDataModel.search(true, true); } else { @@ -57,9 +59,6 @@ public class PartnersViewModel extends AsyncBaseModel { @Command @NotifyChange("selectedPartner") public void search() { - partnersDataModel.clearSelection(); - selectedPartner = null; - //partnersDataModel.search(partialName, partialVatNr, partialAddress); } @Command @@ -67,7 +66,7 @@ public class PartnersViewModel extends AsyncBaseModel { public void onListSelection() { selectedPartner = null; Set selections = partnersDataModel.getSelection(); - if (selections.iterator().hasNext()) { + if (selections.size() == 1) { selectedPartner = selections.iterator().next(); log.info("Selected {}", selectedPartner); } @@ -112,11 +111,12 @@ public class PartnersViewModel extends AsyncBaseModel { partnerWindow.addEventListener("onClose", e -> { if (e.getData() != null) { log.info("Partner popup result {}", e.getData()); - selectedPartner = (Partner) e.getData(); - partnersDataModel.getPartnerService().replace(selectedPartner, editPartner); + Partner modifiedEntity = (Partner) e.getData(); partnersDataModel.clearSelection(); + partnersDataModel.getPartnerService().replace(selectedPartner, modifiedEntity); refresh(); - partnersDataModel.addToSelection(editPartner); + partnersDataModel.addToSelection(modifiedEntity); + selectedPartner = modifiedEntity; } }); partnerWindow.doModal(); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectEditorModel.java new file mode 100644 index 0000000..4cfaf16 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectEditorModel.java @@ -0,0 +1,82 @@ +package hu.user.lis.ui.view; + +import hu.user.lis.db.Partner; +import hu.user.lis.db.Project; +import hu.user.lis.ui.data.PartnersSelectorDataModel; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.log4j.Log4j2; +import org.zkoss.bind.BindContext; +import org.zkoss.bind.BindUtils; +import org.zkoss.bind.annotation.*; +import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zk.ui.event.InputEvent; +import org.zkoss.zk.ui.event.OpenEvent; +import org.zkoss.zk.ui.select.annotation.VariableResolver; +import org.zkoss.zk.ui.select.annotation.WireVariable; +import org.zkoss.zkplus.spring.DelegatingVariableResolver; +import org.zkoss.zul.Window; + +@Log4j2 +@Getter +@Setter +@VariableResolver(DelegatingVariableResolver.class) +public class ProjectEditorModel { + private Project formDocument; + private Partner selectedPartner; + @WireVariable + PartnersSelectorDataModel partnersSelectorDataModel; + + @Init + public void init() { + log.info("Initialized"); + formDocument = (Project) Executions.getCurrent().getArg().get("formDocument"); + selectedPartner = formDocument.getPartner(); + partnersSelectorDataModel.clearSelection(); + } + + @Command + public void onCloseWindow(@BindingParam("target") Window target, @BindingParam("select") boolean select) { + Event closeEvent = new Event("onClose", target, select ? formDocument : null); + Events.postEvent(closeEvent); + } + + @Command + public void onPartnerBandChanging(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { + InputEvent event = (InputEvent) ctx.getTriggerEvent(); + log.info("onPartnerBandChanging: {}", event.getValue()); + partnersSelectorDataModel.search(event.getValue()); + } + + @Command + public void onPartnerBandOpen(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { + OpenEvent event = (OpenEvent) ctx.getTriggerEvent(); + log.info("onPartnerBandOpen: {}", event.isOpen()); + partnersSelectorDataModel.search(null); + } + + @Command + public void onPopupPartners() { + String page = "~./suppliers.zul"; + Window suppliersWindow = (Window) Executions.createComponents(page, null, null); + suppliersWindow.addEventListener("onClose", e -> { + log.info("Suppliers popup result {}", e.getData()); + if (e.getData() != null) { + partnersSelectorDataModel.clearSelection(); + //setSelectedSupplierId(((Supplier) e.getData()).getId()); + BindUtils.postNotifyChange(null, null, this, "selectedSupplierId"); + } + }); + + suppliersWindow.doModal(); + } + + @NotifyChange({"selectedPartner"}) + public void setSelectedPartner(Partner selectedPartner) { + this.selectedPartner = selectedPartner; + formDocument.setPartner(selectedPartner); + } + +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java new file mode 100644 index 0000000..80ac4fd --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java @@ -0,0 +1,152 @@ +package hu.user.lis.ui.view; + +import com.fasterxml.jackson.core.JsonProcessingException; +import hu.user.lis.db.Project; +import hu.user.lis.ui.data.ProjectsDataModel; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; +import org.zkoss.bind.annotation.*; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.select.Selectors; +import org.zkoss.zk.ui.select.annotation.VariableResolver; +import org.zkoss.zk.ui.select.annotation.WireVariable; +import org.zkoss.zkplus.spring.DelegatingVariableResolver; +import org.zkoss.zul.Window; + +import java.util.Collections; +import java.util.Set; + +@Log4j2 +@VariableResolver(DelegatingVariableResolver.class) +public class ProjectsViewModel extends AsyncBaseModel { + @Getter + private Project selectedProject; + @WireVariable + @Getter + ProjectsDataModel projectsDataModel; + private boolean filterShowInActive; + private boolean filterShowActive; + private boolean filterShowBoth; + + @AfterCompose + public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) { + Selectors.wireComponents(view, this, false); + Selectors.wireEventListeners(view, this); + } + + @Init + public void init() { + log.info("Initialized"); + setFilterShowActive(true); + } + + private void refresh() { + projectsDataModel.clearSelection(); + selectedProject = null; + if (filterShowBoth) { + projectsDataModel.search(true, true); + } else { + projectsDataModel.search(filterShowActive, filterShowInActive); + } + } + + @Command + @NotifyChange("selectedProject") + public void search() { + } + + @Command + @NotifyChange("selectedProject") + public void onListSelection() { + selectedProject = null; + Set selections = projectsDataModel.getSelection(); + if (selections.size() == 1) { + selectedProject = selections.iterator().next(); + log.info("Selected {}", selectedProject); + } + } + + @Command + public void onAddNew() { + String page = "~./project.zul"; + Project editEntity = projectsDataModel.getProjectService().createNew(); + Window partnerWindow = (Window) Executions.createComponents(page, null, + Collections.singletonMap("formDocument", editEntity)); + partnerWindow.addEventListener("onClose", e -> { + if (e.getData() != null) { + log.info("Partner popup result {}", e.getData()); + projectsDataModel.getProjectService().add(editEntity); + projectsDataModel.clearSelection(); + refresh(); + projectsDataModel.addToSelection(editEntity); +// Optional listItem = partnersList.getItems().stream() +// .filter(li -> ((Partner) li.getValue()).getId().equals(editPartner.getId())) +// .findFirst(); +// if (listItem.isPresent()) { +// Clients.scrollIntoView(listItem.get()); +// } +// registerTask(() -> { +// }); + } + }); + partnerWindow.doModal(); + } + + @Command + public void onEdit() throws JsonProcessingException { + String page = "~./project.zul"; + Project editEntity = projectsDataModel.getProjectService().copy(selectedProject); + Window partnerWindow = (Window) Executions.createComponents(page, null, + Collections.singletonMap("formDocument", editEntity)); + partnerWindow.addEventListener("onClose", e -> { + if (e.getData() != null) { + log.info("Project popup result {}", e.getData()); + Project modifiedEntity = (Project) e.getData(); + projectsDataModel.clearSelection(); + projectsDataModel.getProjectService().replace(selectedProject, modifiedEntity); + refresh(); + projectsDataModel.addToSelection(modifiedEntity); + selectedProject = modifiedEntity; + } + }); + partnerWindow.doModal(); + } + + + public boolean isFilterShowInActive() { + return filterShowInActive; + } + + @NotifyChange({"filterShowActive", "filterShowInActive", "filterShowBoth"}) + public void setFilterShowInActive(boolean filterShowInActive) { + this.filterShowBoth = false; + this.filterShowActive = false; + this.filterShowInActive = filterShowInActive; + refresh(); + } + + public boolean isFilterShowActive() { + return filterShowActive; + } + + @NotifyChange({"filterShowActive", "filterShowInActive", "filterShowBoth"}) + public void setFilterShowActive(boolean filterShowActive) { + this.filterShowBoth = false; + this.filterShowInActive = false; + this.filterShowActive = filterShowActive; + refresh(); + } + + public boolean isFilterShowBoth() { + return this.filterShowBoth; + } + + @NotifyChange({"filterShowActive", "filterShowInActive", "filterShowBoth"}) + public void setFilterShowBoth(boolean filterShowBoth) { + this.filterShowActive = false; + this.filterShowInActive = false; + this.filterShowBoth = filterShowBoth; + refresh(); + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/SupplierViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/SupplierViewModel.java deleted file mode 100644 index beeb2ea..0000000 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/SupplierViewModel.java +++ /dev/null @@ -1,75 +0,0 @@ -package hu.user.lis.ui.view; - -import hu.user.lis.db.Supplier; -import hu.user.lis.ui.data.SuppliersSimpleDataModel; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.log4j.Log4j2; -import org.zkoss.bind.BindContext; -import org.zkoss.bind.BindUtils; -import org.zkoss.bind.annotation.Command; -import org.zkoss.bind.annotation.ContextParam; -import org.zkoss.bind.annotation.ContextType; -import org.zkoss.bind.annotation.NotifyChange; -import org.zkoss.zk.ui.Executions; -import org.zkoss.zk.ui.event.InputEvent; -import org.zkoss.zk.ui.event.OpenEvent; -import org.zkoss.zk.ui.select.annotation.VariableResolver; -import org.zkoss.zk.ui.select.annotation.WireVariable; -import org.zkoss.zul.Window; - -import java.util.Objects; - -@Log4j2 -@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class) -public class SupplierViewModel { - @Getter - @Setter - @WireVariable - private SuppliersSimpleDataModel suppliersSimpleDataModel; - @Getter - private Supplier selectedSupplier; - @Getter - @Setter - private String selectedSupplierId; - - @Command - public void onBandChanging(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - InputEvent event = (InputEvent) ctx.getTriggerEvent(); - log.info("onBandChanging: {}", event.getValue()); - suppliersSimpleDataModel.search(event.getValue()); - } - - @Command - public void onBandOpen(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - OpenEvent event = (OpenEvent) ctx.getTriggerEvent(); - log.info("onBandOpen: {}", event.isOpen()); - suppliersSimpleDataModel.search(null); - } - - @Command - public void onPopupSuppliers() { - String page = "~./suppliers.zul"; - Window suppliersWindow = (Window) Executions.createComponents(page, null, null); - suppliersWindow.addEventListener("onClose", e -> { - log.info("Suppliers popup result {}", e.getData()); - if (e.getData() != null) { - suppliersSimpleDataModel.clearSelection(); - setSelectedSupplierId(((Supplier) e.getData()).getId()); - BindUtils.postNotifyChange(null, null, this, "selectedSupplierId"); - } - }); - - suppliersWindow.doModal(); - } - - @NotifyChange({"selectedSupplierId", "selectedSupplier"}) - public void setSelectedSupplier(Supplier selectedSupplier) { - this.selectedSupplier = selectedSupplier; - if (Objects.isNull(selectedSupplier)) { - setSelectedSupplierId(null); - } else { - setSelectedSupplierId(selectedSupplier.getId()); - } - } -} diff --git a/lis-ui/src/main/resources/web/index.zul b/lis-ui/src/main/resources/web/index.zul index 16c6aa9..43385bf 100644 --- a/lis-ui/src/main/resources/web/index.zul +++ b/lis-ui/src/main/resources/web/index.zul @@ -1,4 +1,5 @@ + @@ -35,7 +36,7 @@ - + diff --git a/lis-ui/src/main/resources/web/partner-selector.zul b/lis-ui/src/main/resources/web/partner-selector.zul new file mode 100644 index 0000000..9a758ac --- /dev/null +++ b/lis-ui/src/main/resources/web/partner-selector.zul @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + +