Partners, Projects list improved, form validator for empty check done
authorelgekko <vasary@elgekko.net>
Tue, 18 Apr 2023 08:39:00 +0000 (10:39 +0200)
committerelgekko <vasary@elgekko.net>
Tue, 18 Apr 2023 08:39:00 +0000 (10:39 +0200)
lis-services/src/main/java/hu/user/lis/services/data/ProjectService.java
lis-services/src/main/java/hu/user/lis/services/data/ProjectServiceImpl.java
lis-ui/src/main/java/hu/user/lis/ui/data/PartnerSelectorDataModel.java [moved from lis-ui/src/main/java/hu/user/lis/ui/data/PartnersSelectorDataModel.java with 96% similarity]
lis-ui/src/main/java/hu/user/lis/ui/view/PartnerEditorModel.java
lis-ui/src/main/java/hu/user/lis/ui/view/ProjectEditorModel.java
lis-ui/src/main/resources/web/index.zul
lis-ui/src/main/resources/web/partner-selector.zul
lis-ui/src/main/resources/web/partner.zul
lis-ui/src/main/resources/web/project.zul

index 261ef91a4908d0b9eb385b61a73a7b8b00042d6e..c166af510f321d7deda8f2b6fc9943c2e38d1f9d 100644 (file)
@@ -15,4 +15,8 @@ public interface ProjectService {
     Project copy(Project sourceEntity) throws JsonProcessingException;
 
     void replace(Project targetEntity, Project replacementEntity);
+
+    boolean isInvalid(Project entity);
+
+    String toString(Project entity);
 }
index 3850429a6b4b938d2e44e0e1af07ee87bd1afc71..68df25a2dc08d434a5c0adc5ba19eb69f63f8102 100644 (file)
@@ -4,14 +4,18 @@ 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 lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 @Service
+@Log4j2
 public class ProjectServiceImpl implements ProjectService {
     private List<Project> entities;
     @Autowired
@@ -75,4 +79,29 @@ public class ProjectServiceImpl implements ProjectService {
         }
         return result;
     }
+
+    @Override
+    public boolean isInvalid(Project entity) {
+        if (StringUtils.isBlank(entity.getName())) {
+            return true;
+        }
+        if (StringUtils.isBlank(entity.getContactName())) {
+            return true;
+        }
+        if (Objects.isNull(entity.getPartner())) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public String toString(Project entity) {
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            return mapper.writeValueAsString(entity);
+        } catch (JsonProcessingException e) {
+            log.catching(e);
+        }
+        return null;
+    }
 }
similarity index 96%
rename from lis-ui/src/main/java/hu/user/lis/ui/data/PartnersSelectorDataModel.java
rename to lis-ui/src/main/java/hu/user/lis/ui/data/PartnerSelectorDataModel.java
index 6867013d5e1972598aea7090cb7353e4962aa3cc..efb951ae3aba842b2a6db9877ee419c72072dd7f 100644 (file)
@@ -15,7 +15,7 @@ import java.util.stream.Collectors;
 
 @Component
 @Log4j2
-public class PartnersSelectorDataModel extends CachedDataModel<Partner> {
+public class PartnerSelectorDataModel extends CachedDataModel<Partner> {
     static private final int SEARCH_LIMIT = 10;
     private String partialName;
     @Autowired
index 1ee5dbd5299f2575920f8f6dfbaef0b164a39e76..8aea7e5de7abfc1a1d314d1d0b4c9d366ab1d799 100644 (file)
@@ -4,9 +4,14 @@ import hu.user.lis.db.Partner;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.zkoss.bind.BindUtils;
+import org.zkoss.bind.ValidationContext;
 import org.zkoss.bind.annotation.BindingParam;
 import org.zkoss.bind.annotation.Command;
 import org.zkoss.bind.annotation.Init;
+import org.zkoss.bind.validator.AbstractValidator;
+import org.zkoss.zk.ui.Component;
 import org.zkoss.zk.ui.Executions;
 import org.zkoss.zk.ui.event.Event;
 import org.zkoss.zk.ui.event.Events;
@@ -14,23 +19,39 @@ import org.zkoss.zk.ui.select.annotation.VariableResolver;
 import org.zkoss.zkplus.spring.DelegatingVariableResolver;
 import org.zkoss.zul.Window;
 
+import java.util.Objects;
+
 @Log4j2
 @Getter
 @Setter
 @VariableResolver(DelegatingVariableResolver.class)
-public class PartnerEditorModel {
-    private Partner selectedPartner;
+public class PartnerEditorModel extends AbstractValidator {
+    private Partner formDocument;
+    private boolean formInvalid;
 
     @Init
     public void init() {
         log.info("Initialized");
-        selectedPartner = (Partner) Executions.getCurrent().getArg().get("formDocument");
+        formDocument = (Partner) Executions.getCurrent().getArg().get("formDocument");
     }
 
     @Command
     public void onCloseWindow(@BindingParam("target") Window target, @BindingParam("select") boolean select) {
-        Event closeEvent = new Event("onClose", target, select ? selectedPartner : null);
+        if (select && formInvalid) {
+            return;
+        }
+        Event closeEvent = new Event("onClose", target, select ? formDocument : null);
         Events.postEvent(closeEvent);
     }
 
+    @Override
+    public void validate(ValidationContext ctx) {
+        Component target = ctx.getBindContext().getComponent();
+        String property = ctx.getProperty().getProperty();
+        Object value = ctx.getProperty().getValue();
+        log.info("Validating caused by {} {} {}", target.getId(), property, value);
+        boolean invalid = Objects.isNull(value) || StringUtils.isBlank(Objects.toString(value));
+        setFormInvalid(invalid);
+        BindUtils.postNotifyChange(this, "formInvalid");
+    }
 }
index 4cfaf168a9c304886c38e010f8a9b62f17ea680d..804d145739bbe03ce02af1114a0b9b2d5a28b6ff 100644 (file)
@@ -2,13 +2,18 @@ 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 hu.user.lis.ui.data.PartnerSelectorDataModel;
+import hu.user.lis.ui.data.ProjectsDataModel;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
 import org.zkoss.bind.BindContext;
 import org.zkoss.bind.BindUtils;
+import org.zkoss.bind.ValidationContext;
 import org.zkoss.bind.annotation.*;
+import org.zkoss.bind.validator.AbstractValidator;
+import org.zkoss.zk.ui.Component;
 import org.zkoss.zk.ui.Executions;
 import org.zkoss.zk.ui.event.Event;
 import org.zkoss.zk.ui.event.Events;
@@ -19,26 +24,34 @@ import org.zkoss.zk.ui.select.annotation.WireVariable;
 import org.zkoss.zkplus.spring.DelegatingVariableResolver;
 import org.zkoss.zul.Window;
 
+import java.util.Objects;
+
 @Log4j2
 @Getter
 @Setter
 @VariableResolver(DelegatingVariableResolver.class)
-public class ProjectEditorModel {
+public class ProjectEditorModel extends AbstractValidator {
     private Project formDocument;
     private Partner selectedPartner;
     @WireVariable
-    PartnersSelectorDataModel partnersSelectorDataModel;
+    private PartnerSelectorDataModel partnerSelectorDataModel;
+    @WireVariable
+    private ProjectsDataModel projectsDataModel;
+    private boolean formInvalid;
 
     @Init
     public void init() {
         log.info("Initialized");
         formDocument = (Project) Executions.getCurrent().getArg().get("formDocument");
         selectedPartner = formDocument.getPartner();
-        partnersSelectorDataModel.clearSelection();
+        partnerSelectorDataModel.clearSelection();
     }
 
     @Command
     public void onCloseWindow(@BindingParam("target") Window target, @BindingParam("select") boolean select) {
+        if (select && formInvalid) {
+            return;
+        }
         Event closeEvent = new Event("onClose", target, select ? formDocument : null);
         Events.postEvent(closeEvent);
     }
@@ -47,14 +60,14 @@ public class ProjectEditorModel {
     public void onPartnerBandChanging(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) {
         InputEvent event = (InputEvent) ctx.getTriggerEvent();
         log.info("onPartnerBandChanging: {}", event.getValue());
-        partnersSelectorDataModel.search(event.getValue());
+        partnerSelectorDataModel.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);
+        partnerSelectorDataModel.search(null);
     }
 
     @Command
@@ -64,7 +77,7 @@ public class ProjectEditorModel {
         suppliersWindow.addEventListener("onClose", e -> {
             log.info("Suppliers popup result {}", e.getData());
             if (e.getData() != null) {
-                partnersSelectorDataModel.clearSelection();
+                partnerSelectorDataModel.clearSelection();
                 //setSelectedSupplierId(((Supplier) e.getData()).getId());
                 BindUtils.postNotifyChange(null, null, this, "selectedSupplierId");
             }
@@ -79,4 +92,14 @@ public class ProjectEditorModel {
         formDocument.setPartner(selectedPartner);
     }
 
+    @Override
+    public void validate(ValidationContext ctx) {
+        Component target = ctx.getBindContext().getComponent();
+        String property = ctx.getProperty().getProperty();
+        Object value = ctx.getProperty().getValue();
+        log.info("Validating caused by {} {} {}", target.getId(), property, value);
+        boolean invalid = Objects.isNull(value) || StringUtils.isBlank(Objects.toString(value));
+        setFormInvalid(invalid);
+        BindUtils.postNotifyChange(this, "formInvalid");
+    }
 }
index 43385bfe664e8c2a83b54dc5c68466a847a42028..100e7ceafc4ddb3bef183591c49100a7bc2a31c1 100644 (file)
@@ -1,6 +1,12 @@
 <?component name="partners" inline="true" macroURI="~./partners.zul"?>
 <?component name="projects" inline="true" macroURI="~./projects.zul"?>
 <zk>
+    <style>
+        .z-window-header {
+        font-size: 18px;
+        font-weight: bolder;
+        }
+    </style>
     <window vflex="true" viewModel="@id('vm') @init('hu.user.lis.ui.view.IndexViewModel')">
         <caption>
             <hlayout valign="middle">
index 9a758ac887e0ad67727cbb430cf5f93e14591374..7eb2f5e920d47901c66752bab7ba5dfce0a80cad 100644 (file)
@@ -32,8 +32,8 @@
             </attribute>
             <bandpopup>
                 <listbox id="bd-list" height="250px" width="450px"
-                         model="@bind(vm.partnersSelectorDataModel)"
-                         selectedItem="@bind(vm.selectedPartner)"
+                         model="@bind(vm.partnerSelectorDataModel)"
+                         selectedItem="@bind(vm.selectedPartner) @validator(vm)"
                          onClick="bd.close()"
                          onDoubleClick="bd.close()">
                     <listhead visible="false">
@@ -47,6 +47,6 @@
                 </listbox>
             </bandpopup>
         </bandbox>
-        <button iconSclass="z-icon-search-plus" onClick="@command('onPopupPartners')"/>
+        <!--        <button iconSclass="z-icon-search-plus" onClick="@command('onPopupPartners')"/>-->
     </hlayout>
 </zk>
\ No newline at end of file
index 7e6c144ab1431a9ffa907bdb745e23135d5468d5..17b9fe6ab9ce8ecc2628ef0232ab46cd5757f750 100644 (file)
@@ -7,16 +7,16 @@
             <center border="none" vflex="true" hflex="true">
                 <vlayout hflex="true">
                     <label value="Név"/>
-                    <textbox hflex="true" instant="true" value="@bind(vm.selectedPartner.name)"
+                    <textbox hflex="true" instant="true" value="@bind(vm.formDocument.name) @validator(vm)"
                              forward="onOK=submit.onClick, onCancel=cancel.onClick"/>
                     <label value="Adószám"/>
-                    <textbox hflex="true" instant="true" value="@bind(vm.selectedPartner.vatNr)"
+                    <textbox hflex="true" instant="true" value="@bind(vm.formDocument.vatNr) @validator(vm)"
                              forward="onOK=submit.onClick, onCancel=cancel.onClick"/>
                     <label value="Cím"/>
-                    <textbox hflex="true" instant="true" value="@bind(vm.selectedPartner.address)"
+                    <textbox hflex="true" instant="true" value="@bind(vm.formDocument.address) @validator(vm)"
                              forward="onOK=submit.onClick, onCancel=cancel.onClick"/>
                     <label value="Aktív"/>
-                    <checkbox mold="switch" checked="@bind(vm.selectedPartner.active)"/>
+                    <checkbox mold="switch" checked="@bind(vm.formDocument.active)"/>
                 </vlayout>
             </center>
             <south flex="true" style="text-align: right; padding: 10px">
@@ -24,7 +24,8 @@
                     <button id="cancel" label="Bezár"
                             onClick="@command('onCloseWindow', target=partnerPopup, select=false)"/>
                     <button id="submit" label="Mentés"
-                            onClick="@command('onCloseWindow', target=partnerPopup, select=true)"/>
+                            onClick="@command('onCloseWindow', target=partnerPopup, select=true)"
+                            disabled="@bind(vm.formInvalid)"/>
                 </hlayout>
             </south>
         </borderlayout>
index df9f54d1ea38ead0ca8a9815f8614d0f25bab910..3de37c129b7c9325a88561cd94d27214c11af5e9 100644 (file)
@@ -8,13 +8,17 @@
             <center border="none" vflex="true" hflex="true">
                 <vlayout hflex="true">
                     <label value="Azonosító"/>
-                    <textbox hflex="true" instant="true" value="@bind(vm.formDocument.humanId)" readonly="true"
+                    <textbox hflex="true" instant="true"
+                             value="@bind(vm.formDocument.humanId) @validator(vm)"
+                             readonly="true"
                              forward="onOK=submit.onClick, onCancel=cancel.onClick"/>
                     <label value="Név"/>
-                    <textbox hflex="true" instant="true" value="@bind(vm.formDocument.name)"
+                    <textbox hflex="true" instant="true"
+                             value="@bind(vm.formDocument.name) @validator(vm)"
                              forward="onOK=submit.onClick, onCancel=cancel.onClick"/>
                     <label value="Kapcsolattartó"/>
-                    <textbox hflex="true" instant="true" value="@bind(vm.formDocument.contactName)"
+                    <textbox hflex="true" instant="true"
+                             value="@bind(vm.formDocument.contactName) @validator(vm)"
                              forward="onOK=submit.onClick, onCancel=cancel.onClick"/>
                     <label value="Partner"/>
                     <partner-selector/>
@@ -27,7 +31,8 @@
                     <button id="cancel" label="Bezár"
                             onClick="@command('onCloseWindow', target=currentPopup, select=false)"/>
                     <button id="submit" label="Mentés"
-                            onClick="@command('onCloseWindow', target=currentPopup, select=true)"/>
+                            onClick="@command('onCloseWindow', target=currentPopup, select=true)"
+                            disabled="@bind(vm.formInvalid)"/>
                 </hlayout>
             </south>
         </borderlayout>