Column show/hide implemented for Partners
authorVásáry Dániel <vasary@elgekko.net>
Mon, 26 Feb 2024 12:14:16 +0000 (13:14 +0100)
committerVásáry Dániel <vasary@elgekko.net>
Mon, 26 Feb 2024 12:14:16 +0000 (13:14 +0100)
.idea/compiler.xml
lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeInvoiceService.java
lis-ui/src/main/java/hu/user/lis/ui/data/common/CachedSpringDataModel.java
lis-ui/src/main/java/hu/user/lis/ui/data/common/ColDef.java [new file with mode: 0644]
lis-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java
lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java
lis-ui/src/main/resources/web/partners.zul

index 08bd451bf077a9931fc1106790bc679f262146f6..e3dd852dea8544166bb75176ba7738ee49c0b421 100644 (file)
         </processorPath>
         <module name="lis-app" />
         <module name="lis-ui" />
-        <module name="zk-user-components" />
         <module name="lis-db" />
         <module name="lis-workflow" />
         <module name="lis-service" />
       </profile>
     </annotationProcessing>
+    <bytecodeTargetLevel>
+      <module name="zk-user-components" target="1.8" />
+    </bytecodeTargetLevel>
   </component>
   <component name="JavacSettings">
     <option name="ADDITIONAL_OPTIONS_OVERRIDE">
index 6a9070fb5123c32e400ffa6e1c1eecfe443a31f5..8023f781f5e35876c7b282a7fcf956c6daab0785 100644 (file)
@@ -49,7 +49,7 @@ public class TaxOfficeInvoiceService {
 
     public String queryInboundInvoiceDataAsString(String invoiceNumber, String supplierTaxNumber) throws Exception {
         InvoiceNumberQueryType query = new InvoiceNumberQueryType();
-        query.setInvoiceDirection(InvoiceDirectionType.INBOUND);
+        //query.setInvoiceDirection(InvoiceDirectionType.INBOUND);
         query.setInvoiceNumber(invoiceNumber);
         query.setSupplierTaxNumber(supplierTaxNumber);
 
index 9c278423f4c32be38914146871668767ec4bd139..56e55ead607213cb8c0aebe802d3e35804d4a97f 100644 (file)
@@ -11,13 +11,11 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Component;
-import org.zkoss.json.JSONObject;
+import org.zkoss.bind.BindUtils;
 import org.zkoss.zul.FieldComparator;
 
-import java.util.Comparator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Component
 @Log4j2
@@ -25,34 +23,53 @@ public abstract class CachedSpringDataModel<T> extends CachedDataModel<T> {
 
     @Getter
     @Setter
-    JSONObject columnSettings = new JSONObject();
+    ColDef[] columnSettings = {};
 
     @Autowired
     CurrentProfile currentProfile;
 
     @Autowired
-    EntityDataService<JSONObject> entityDataService;
+    EntityDataService<ColDef[]> entityDataService;
 
-    public void addColumns(Map<String, String> columns) {
+    public void addColumns(List<ColDef> columns) {
         Profile profile = currentProfile.getSetting(getClass().getSimpleName());
-        columns.keySet().forEach(colName -> addColumn(colName, columns.get(colName)));
-        if (Objects.isNull(profile)) {
+        ColDef[] savedColumns = validSavedColumns(profile, columns);
+        if (Objects.isNull(savedColumns)) {
+            columnSettings = columns.toArray(new ColDef[]{});
             saveProfileSetting();
         } else {
-            JSONObject savedColumns = entityDataService.fromJSON(profile.getSetting(), JSONObject.class);
-            if (savedColumns.keySet().equals(columns.keySet())) {
-//                log.info("{}", Strings.join(objects, ','));
-                columnSettings.keySet().forEach(colName -> {
-                    LinkedHashMap<String, Object> colSetting = (LinkedHashMap<String, Object>) savedColumns.get(colName);
-                    if (!colSetting.containsKey("visible")) {
-                        colSetting.put("visible", true);
-                    }
-                });
-                columnSettings = savedColumns;
-            } else {
-                saveProfileSetting();
-            }
+            columnSettings = savedColumns;
         }
+        columns.forEach(this::setSortDirection);
+    }
+
+    private ColDef[] validSavedColumns(Profile profile, List<ColDef> columns) {
+        ColDef[] savedColumns;
+        if (Objects.isNull(profile)) {
+            return null;
+        }
+        try {
+            savedColumns = entityDataService.fromJSON(profile.getSetting(), ColDef[].class);
+        } catch (Exception e) {
+            log.warn(e.getMessage());
+            return null;
+        }
+
+        if (Objects.isNull(savedColumns)) {
+            return null;
+        }
+
+        Set<String> savedColumnNames = Arrays.stream(savedColumns).map(ColDef::getName).collect(Collectors.toSet());
+        Set<String> currentColumnNames = columns.stream().map(ColDef::getName).collect(Collectors.toSet());
+        if (!currentColumnNames.equals(savedColumnNames)) {
+            return null;
+        }
+
+        return savedColumns;
+    }
+
+    public void addColumns(Map<String, String> columns) {
+        throw new RuntimeException("OBSOLATE");
     }
 
     private void saveProfileSetting() {
@@ -64,14 +81,9 @@ public abstract class CachedSpringDataModel<T> extends CachedDataModel<T> {
         currentProfile.persistSetting(columnProfile);
     }
 
-    private void addColumn(String name, String direction) {
-        JSONObject sort = new JSONObject();
-        sort.put("sortDirection", direction);
-        sort.put("visible", true);
-        columnSettings.put(name, sort);
-
-        if (!direction.equals(NATURAL)) {
-            setSortComparator(new FieldComparator(name, direction.equals(ASCENDING)));
+    private void setSortDirection(ColDef colDef) {
+        if (!colDef.getSortDirection().equals(NATURAL)) {
+            setSortComparator(new FieldComparator(colDef.getName(), colDef.getSortDirection().equals(ASCENDING)));
         }
     }
 
@@ -93,16 +105,21 @@ public abstract class CachedSpringDataModel<T> extends CachedDataModel<T> {
         super.sort(cmpr, ascending);
 
         FieldComparator sortComparator = (FieldComparator) cmpr;
-        columnSettings.keySet().forEach(colName -> {
-            LinkedHashMap<String, String> col = (LinkedHashMap<String, String>) columnSettings.get(colName);
-            if (colName.equals(sortComparator.getRawOrderBy())) {
-                col.put("sortDirection", ascending ? ASCENDING : DESCENDING);
+        Arrays.stream(columnSettings).forEach(colDef -> {
+            if (colDef.getName().equals(sortComparator.getRawOrderBy())) {
+                colDef.setSortDirection(ascending ? ASCENDING : DESCENDING);
             } else {
-                col.put("sortDirection", NATURAL);
+                colDef.setSortDirection(NATURAL);
             }
         });
         saveProfileSetting();
-        log.info("Sort settings for {} : {}", getClass().getSimpleName(), columnSettings.toJSONString());
+        log.info("Sort settings for {} : {}", getClass().getSimpleName(), columnSettings);
+    }
+
+    public void onHeaderMenuClicked(ColDef node) {
+        node.setVisible(!node.isVisible());
+        saveProfileSetting();
+        BindUtils.postNotifyChange(this, "columnSettings");
     }
 
 }
diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/common/ColDef.java b/lis-ui/src/main/java/hu/user/lis/ui/data/common/ColDef.java
new file mode 100644 (file)
index 0000000..c5d763f
--- /dev/null
@@ -0,0 +1,21 @@
+package hu.user.lis.ui.data.common;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Builder
+public class ColDef {
+    private String name;
+    private String align;
+    private String label;
+    private String sortDirection;
+    @Builder.Default
+    private boolean visible = true;
+
+    public String getSort() {
+        return String.format("auto(%s)", name);
+    }
+}
index 2218c30d939320adcf07222e043de0bf59118e58..670241d2334a1ea9a2279a9fd617b4ea7fc02920 100644 (file)
@@ -1,23 +1,23 @@
 package hu.user.lis.ui.view;
 
-import com.google.common.collect.ImmutableMap;
 import hu.user.lis.db.Partner;
 import hu.user.lis.ui.Constants;
 import hu.user.lis.ui.data.PartnersDataModel;
 import hu.user.lis.ui.data.common.CachedSpringDataModel;
+import hu.user.lis.ui.data.common.ColDef;
 import hu.user.lis.ui.editor.common.Editors;
 import hu.user.lis.ui.event.SaveEntityEvent;
 import hu.user.lis.ui.view.common.FilterActiveViewModel;
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
 import org.zkoss.bind.BindUtils;
+import org.zkoss.bind.annotation.BindingParam;
 import org.zkoss.bind.annotation.Command;
 import org.zkoss.bind.annotation.Init;
 import org.zkoss.zk.ui.select.annotation.WireVariable;
 import org.zkoss.zul.Messagebox;
 
-import static hu.user.lis.ui.data.common.CachedDataModel.ASCENDING;
-import static hu.user.lis.ui.data.common.CachedDataModel.NATURAL;
+import java.util.Arrays;
 
 @Log4j2
 public class PartnersViewModel extends FilterActiveViewModel<Partner> {
@@ -38,11 +38,11 @@ public class PartnersViewModel extends FilterActiveViewModel<Partner> {
     @Init
     public void init() {
         super.init();
-        addColumns(ImmutableMap.of(
-                "name", ASCENDING,
-                "vatNr", NATURAL,
-                "address", NATURAL,
-                "active", NATURAL
+        addColumns(Arrays.asList(
+                "name,Név,ascending,left,true",
+                "vatNr,Adószám,natural,left,true",
+                "address,Cím,natural,left,true",
+                "active,Aktív,natural,left,true"
         ));
     }
 
@@ -89,4 +89,9 @@ public class PartnersViewModel extends FilterActiveViewModel<Partner> {
                 });
     }
 
+    @Command
+    public void onHeaderMenuClicked(@BindingParam("node") ColDef node) {
+        partnersDataModel.onHeaderMenuClicked(node);
+    }
+
 }
index 14fd5074146ba7fd232b75f28560f722aa212613..b45b898dc88d775f467638d303418d6e9b9b54eb 100644 (file)
@@ -2,12 +2,12 @@ package hu.user.lis.ui.view.common;
 
 import hu.user.lis.service.data.EntityDataService;
 import hu.user.lis.ui.data.common.CachedSpringDataModel;
+import hu.user.lis.ui.data.common.ColDef;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.StringUtils;
 import org.zkoss.bind.annotation.*;
-import org.zkoss.json.JSONObject;
 import org.zkoss.zk.ui.Component;
 import org.zkoss.zk.ui.select.Selectors;
 import org.zkoss.zk.ui.select.annotation.VariableResolver;
@@ -16,8 +16,10 @@ import org.zkoss.zk.ui.util.Clients;
 import org.zkoss.zkplus.spring.DelegatingVariableResolver;
 
 import java.io.Serializable;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 
 @Log4j2
@@ -40,7 +42,21 @@ public abstract class EntityViewModel<T extends Serializable> {
         getDataModel().addColumns(columns);
     }
 
-    public JSONObject getCols() {
+    protected void addColumns(List<String> colDefs) {
+        List<ColDef> columns = colDefs.stream().map(colDefStr -> {
+            String[] tokens = colDefStr.split(",");
+            return ColDef.builder()
+                    .name(tokens[0])
+                    .label(tokens[1])
+                    .sortDirection(tokens[2])
+                    .align(tokens[3])
+                    .visible(Boolean.parseBoolean(tokens[4]))
+                    .build();
+        }).collect(Collectors.toList());
+        getDataModel().addColumns(columns);
+    }
+
+    public ColDef[] getCols() {
         return getDataModel().getColumnSettings();
     }
 
index 57dd7d6a57d0bcf5c4d835174c114892a9b2fb76..bb543a36f2c2e7a947e8eface443ae823ec604c5 100644 (file)
             </north>
             <center border="none" flex="true">
                 <vlayout>
-                    <!--                    https://www.zkoss.org/wiki/ZK_Developer%27s_Reference/MVVM/Data_Binding/Children_Binding-->
-                    <menupopup id="editPopup">
-                        <menuitem label="Group" image="~./zul/img/grid/menu-group.png"/>
-                        <menuitem label="Sort Ascending" image="~./zul/img/grid/menu-arrowup.png"/>
-                        <menuitem label="Sort Descending" image="~./zul/img/grid/menu-arrowdown.png"/>
+                    <menupopup id="editPopup"
+                               children="@bind(vm.partnersDataModel.columnSettings) @template('menu-item')">
+                        <template name="menu-item" var="node">
+                            <menuitem label="@load(node.label)" checked="@load(node.visible)"
+                                      onClick="@command('onHeaderMenuClicked', node=node)"/>
+                        </template>
                     </menupopup>
                     <listbox vflex="true" model="@load(vm.partnersDataModel)"
                              autopaging="true" mold="paging" pagingPosition="top" multiple="false"
                              onSelect="@command('onListSelection')">
-                        <listhead sizable="true" menupopup="editPopup">
-                            <listheader label="Név" sort="auto(name)" align="left"
-                                        visible="@bind(vm.cols['name'].visible)"
-                                        sortDirection="@load(vm.cols['name'].sortDirection)"/>
-                            <listheader label="Adószám" sort="auto(vatNr)" align="left"
-                                        sortDirection="@load(vm.cols['vatNr'].sortDirection)"/>
-                            <listheader label="Cím" sort="auto(address)" align="left"
-                                        sortDirection="@load(vm.cols['address'].sortDirection)"/>
-                            <listheader label="Aktív" sort="auto(active)" align="left"
-                                        sortDirection="@load(vm.cols['active'].sortDirection)"/>
+                        <listhead sizable="true" menupopup="editPopup"
+                                  children="@bind(vm.partnersDataModel.columnSettings) @template('head-item')">
+                            <template name="head-item" var="node">
+                                <listheader label="@load(node.label)" sort="@load(node.sort)" align="@load(node.align)"
+                                            visible="@load(node.visible)" sortDirection="@load(node.sortDirection)"/>
+                            </template>
+                            <!--                            -->
+                            <!--                            <listheader label="Név" sort="auto(name)" align="left"-->
+                            <!--                                        visible="true"-->
+                            <!--                                        sortDirection="@load(vm.cols['name'].sortDirection)"/>-->
+                            <!--                            <listheader label="Adószám" sort="auto(vatNr)" align="left"-->
+                            <!--                                        sortDirection="@load(vm.cols['vatNr'].sortDirection)"/>-->
+                            <!--                            <listheader label="Cím" sort="auto(address)" align="left"-->
+                            <!--                                        sortDirection="@load(vm.cols['address'].sortDirection)"/>-->
+                            <!--                            <listheader label="Aktív" sort="auto(active)" align="left"-->
+                            <!--                                        sortDirection="@load(vm.cols['active'].sortDirection)"/>-->
 
                         </listhead>
                         <template name="model">