Reorder Partners columns
authorVásáry Dániel <vasary@elgekko.net>
Mon, 26 Feb 2024 15:05:25 +0000 (16:05 +0100)
committerVásáry Dániel <vasary@elgekko.net>
Mon, 26 Feb 2024 15:05:25 +0000 (16:05 +0100)
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
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/java/hu/user/lis/ui/view/renderer/ReorderedItemsRenderer.java [new file with mode: 0644]
lis-ui/src/main/resources/web/partners.zul

index 56e55ead607213cb8c0aebe802d3e35804d4a97f..d9f9aed2de0e90d223b28da7d3f3118407c901f2 100644 (file)
@@ -3,8 +3,8 @@ package hu.user.lis.ui.data.common;
 import hu.user.lis.db.Profile;
 import hu.user.lis.service.data.EntityDataService;
 import hu.user.lis.ui.auth.CurrentProfile;
+import hu.user.lis.ui.view.renderer.ReorderedItemsRenderer;
 import lombok.Getter;
-import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.PageRequest;
@@ -13,6 +13,7 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Component;
 import org.zkoss.bind.BindUtils;
 import org.zkoss.zul.FieldComparator;
+import org.zkoss.zul.Listheader;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -21,24 +22,24 @@ import java.util.stream.Collectors;
 @Log4j2
 public abstract class CachedSpringDataModel<T> extends CachedDataModel<T> {
 
-    @Getter
-    @Setter
-    ColDef[] columnSettings = {};
+    @Autowired
+    private CurrentProfile currentProfile;
 
     @Autowired
-    CurrentProfile currentProfile;
+    private EntityDataService<ColDef[]> entityDataService;
 
+    @Getter
     @Autowired
-    EntityDataService<ColDef[]> entityDataService;
+    private ReorderedItemsRenderer renderer;
 
     public void addColumns(List<ColDef> columns) {
         Profile profile = currentProfile.getSetting(getClass().getSimpleName());
         ColDef[] savedColumns = validSavedColumns(profile, columns);
         if (Objects.isNull(savedColumns)) {
-            columnSettings = columns.toArray(new ColDef[]{});
+            renderer.setColumnSettings(columns.toArray(new ColDef[]{}));
             saveProfileSetting();
         } else {
-            columnSettings = savedColumns;
+            renderer.setColumnSettings(savedColumns);
         }
         columns.forEach(this::setSortDirection);
     }
@@ -76,7 +77,7 @@ public abstract class CachedSpringDataModel<T> extends CachedDataModel<T> {
         Profile columnProfile = Profile.builder()
                 .login(currentProfile.getAssociate().getLogin())
                 .type(getClass().getSimpleName())
-                .setting(entityDataService.toJSON(columnSettings))
+                .setting(entityDataService.toJSON(renderer.getColumnSettings()))
                 .build();
         currentProfile.persistSetting(columnProfile);
     }
@@ -105,7 +106,7 @@ public abstract class CachedSpringDataModel<T> extends CachedDataModel<T> {
         super.sort(cmpr, ascending);
 
         FieldComparator sortComparator = (FieldComparator) cmpr;
-        Arrays.stream(columnSettings).forEach(colDef -> {
+        Arrays.stream(renderer.getColumnSettings()).forEach(colDef -> {
             if (colDef.getName().equals(sortComparator.getRawOrderBy())) {
                 colDef.setSortDirection(ascending ? ASCENDING : DESCENDING);
             } else {
@@ -113,7 +114,7 @@ public abstract class CachedSpringDataModel<T> extends CachedDataModel<T> {
             }
         });
         saveProfileSetting();
-        log.info("Sort settings for {} : {}", getClass().getSimpleName(), columnSettings);
+        //log.info("Sort settings for {} : {}", getClass().getSimpleName(), columnSettings);
     }
 
     public void onHeaderMenuClicked(ColDef node) {
@@ -122,5 +123,25 @@ public abstract class CachedSpringDataModel<T> extends CachedDataModel<T> {
         BindUtils.postNotifyChange(this, "columnSettings");
     }
 
+    public void onHeaderSizeChanged(int colIndex, String changedWidth) {
+        ColDef node = renderer.getColumnSettings()[colIndex];
+        node.setWidth(changedWidth);
+        saveProfileSetting();
+        BindUtils.postNotifyChange(this, "columnSettings");
+    }
+
+    public void onHeaderReorder(Listheader dragged, Listheader dropped) {
+        int dragColIndex = dragged.getColumnIndex();
+        int dropColIndex = dropped.getColumnIndex();
+        ColDef dropNode = renderer.getColumnSettings()[dropColIndex];
+        renderer.getColumnSettings()[dropColIndex] = renderer.getColumnSettings()[dragColIndex];
+        renderer.getColumnSettings()[dragColIndex] = dropNode;
+        saveProfileSetting();
+        BindUtils.postNotifyChange(this, "columnSettings");
+
+
+        //fireEvent(ListDataEvent.STRUCTURE_CHANGED, -1, -1);
+    }
+
 }
 
index c5d763fe05002aa2c5d5043d4ed393b1ac59bf12..52692d28bfea6b6d2d93e6b5c07d50217a350c05 100644 (file)
@@ -8,8 +8,10 @@ import lombok.Setter;
 @Setter
 @Builder
 public class ColDef {
+    private int index;
     private String name;
     private String align;
+    private String width;
     private String label;
     private String sortDirection;
     @Builder.Default
index 670241d2334a1ea9a2279a9fd617b4ea7fc02920..9179d29506a831f90aabdac420a0dc3aa5025422 100644 (file)
@@ -10,12 +10,14 @@ 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.BindContext;
 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.bind.annotation.*;
+import org.zkoss.zk.ui.event.DropEvent;
 import org.zkoss.zk.ui.select.annotation.WireVariable;
+import org.zkoss.zul.Listheader;
 import org.zkoss.zul.Messagebox;
+import org.zkoss.zul.event.ColSizeEvent;
 
 import java.util.Arrays;
 
@@ -94,4 +96,30 @@ public class PartnersViewModel extends FilterActiveViewModel<Partner> {
         partnersDataModel.onHeaderMenuClicked(node);
     }
 
+    @Command
+    public void onHeaderSizeChanged(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx, @BindingParam("node") ColDef node) {
+        ColSizeEvent evt = (ColSizeEvent) ctx.getTriggerEvent();
+        partnersDataModel.onHeaderSizeChanged(evt.getColIndex(), evt.getWidth());
+    }
+
+    @Command
+    public void onHeaderReorder(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) {
+        DropEvent ev = (DropEvent) ctx.getTriggerEvent();
+        Listheader dragged = (Listheader) ev.getDragged();
+        Listheader dropped = (Listheader) ev.getTarget();
+        partnersDataModel.onHeaderReorder(dragged, dropped);
+//        int from = lHead.getChildren().indexOf(dragged);
+//        int to = lHead.getChildren().indexOf(droppedOn);
+//
+//        // swap the positions
+//        lHead.insertBefore(dragged, droppedOn);
+//
+//        // swap related Listcell in all Listitem instances
+//        for (Listitem item : lbox.getItems()) {
+//            item.insertBefore(item.getChildren().get(from), item.getChildren().get(to));
+//        }
+
+    }
+
+
 }
index b45b898dc88d775f467638d303418d6e9b9b54eb..20b6d0ffce265cf25f2021710ee09cced2bc4609 100644 (file)
@@ -16,10 +16,10 @@ import org.zkoss.zk.ui.util.Clients;
 import org.zkoss.zkplus.spring.DelegatingVariableResolver;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 
 @Log4j2
@@ -43,23 +43,23 @@ public abstract class EntityViewModel<T extends Serializable> {
     }
 
     protected void addColumns(List<String> colDefs) {
-        List<ColDef> columns = colDefs.stream().map(colDefStr -> {
+        int index = 0;
+        List<ColDef> columns = new ArrayList<>();
+        for (String colDefStr : colDefs) {
             String[] tokens = colDefStr.split(",");
-            return ColDef.builder()
+            ColDef colDef = ColDef.builder()
+                    .index(index++)
                     .name(tokens[0])
                     .label(tokens[1])
                     .sortDirection(tokens[2])
                     .align(tokens[3])
                     .visible(Boolean.parseBoolean(tokens[4]))
                     .build();
-        }).collect(Collectors.toList());
+            columns.add(colDef);
+        }
         getDataModel().addColumns(columns);
     }
 
-    public ColDef[] getCols() {
-        return getDataModel().getColumnSettings();
-    }
-
     abstract protected CachedSpringDataModel<T> getDataModel();
 
     @AfterCompose
diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/renderer/ReorderedItemsRenderer.java b/lis-ui/src/main/java/hu/user/lis/ui/view/renderer/ReorderedItemsRenderer.java
new file mode 100644 (file)
index 0000000..77fadec
--- /dev/null
@@ -0,0 +1,121 @@
+package hu.user.lis.ui.view.renderer;
+
+import hu.user.lis.ui.data.common.ColDef;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.stereotype.Component;
+import org.zkoss.bind.Binder;
+import org.zkoss.bind.impl.AbstractForEachStatus;
+import org.zkoss.bind.impl.AbstractRenderer;
+import org.zkoss.bind.impl.BinderUtil;
+import org.zkoss.bind.impl.IndirectBinding;
+import org.zkoss.lang.Objects;
+import org.zkoss.zk.ui.UiException;
+import org.zkoss.zk.ui.util.ForEachStatus;
+import org.zkoss.zk.ui.util.Template;
+import org.zkoss.zul.*;
+
+import java.io.Serializable;
+
+@Log4j2
+@Component
+public class ReorderedItemsRenderer extends AbstractRenderer implements ListitemRenderer<Object>, Serializable {
+    //kell egy index map, es a
+
+    @Getter
+    @Setter
+    private ColDef[] columnSettings;
+
+    @Override
+    public void render(Listitem item, final Object data, final int index) throws Exception {
+        log.info("Rendering {} {} {}", item.getIndex(), item.getLabel(), data);
+        final Listbox listbox = (Listbox) item.getParent();
+        final int size = listbox.getModel().getSize();
+        String subtype = item instanceof Listgroup ? "group" : (item instanceof Listgroupfoot ? "groupfoot" : null);
+        Template tm = this.resolveTemplate(listbox, item, data, columnSettings[index].getIndex(), size, "model", subtype);
+        if (tm == null) {
+            item.setLabel(Objects.toString(data));
+            item.setValue(data);
+        } else {
+            ForEachStatus iterStatus = new AbstractForEachStatus() {
+                private static final long serialVersionUID = 1L;
+
+                public int getIndex() {
+                    return index;
+                }
+
+                public Object getCurrent() {
+                    return data;
+                }
+
+                public Integer getEnd() {
+                    return size;
+                }
+            };
+            String var = (String) tm.getParameters().get("var");
+            String varnm = var == null ? "each" : var;
+            String itervar = (String) tm.getParameters().get("status");
+            String itervarnm = itervar == null ? (var == null ? "forEachStatus" : varnm + "Status") : itervar;
+            Object oldVar = listbox.getAttribute(varnm);
+            Object oldIter = listbox.getAttribute(itervarnm);
+            listbox.setAttribute(varnm, data);
+            listbox.setAttribute(itervarnm, iterStatus);
+            org.zkoss.zk.ui.Component[] items = this.filterOutShadows(listbox, tm.create(listbox, item, null, null));
+            if (oldVar != null) {
+                listbox.setAttribute(varnm, oldVar);
+            } else {
+                listbox.removeAttribute(varnm);
+            }
+
+            if (oldIter != null) {
+                listbox.setAttribute(itervarnm, oldIter);
+            } else {
+                listbox.removeAttribute(itervarnm);
+            }
+
+            if (items.length != 1) {
+                throw new UiException("The model template must have exactly one item, not " + items.length);
+            }
+
+            final Listitem nli = (Listitem) items[0];
+            nli.setAttribute("$VAR$", varnm);
+            nli.setAttribute("$isTemplateModelEnabled$", true);
+            nli.setAttribute("$currentIndexResolver$", new IndirectBinding(data) {
+                public Binder getBinder() {
+                    return BinderUtil.getBinder(nli, true);
+                }
+
+                protected ListModel getModel() {
+                    return listbox.getListModel();
+                }
+
+                public org.zkoss.zk.ui.Component getComponent() {
+                    return nli;
+                }
+            });
+            this.addItemReference(listbox, nli, index, varnm);
+            nli.setAttribute(itervarnm, iterStatus);
+            if (nli instanceof Listgroup && item instanceof Listgroup) {
+                ((Listgroup) nli).setOpen(((Listgroup) item).isOpen());
+            }
+
+            Object obj = item.removeAttribute("$TemplateVar$");
+            if (obj != null) {
+                nli.setAttribute("$TemplateVar$", obj);
+            } else {
+                nli.removeAttribute("$TemplateVar$");
+            }
+
+            this.addTemplateTracking(listbox, nli, data, index, size);
+            if (nli.getValue() == null) {
+                nli.setValue(data);
+            }
+
+            item.setAttribute("org.zkoss.zul.model.renderAs", nli);
+            item.detach();
+        }
+
+    }
+
+}
index bb543a36f2c2e7a947e8eface443ae823ec604c5..4dad406137e7846c7cae9e42381dc36876d2c2a4 100644 (file)
             <center border="none" flex="true">
                 <vlayout>
                     <menupopup id="editPopup"
-                               children="@bind(vm.partnersDataModel.columnSettings) @template('menu-item')">
+                               children="@bind(vm.partnersDataModel.renderer.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)"
+                             itemRenderer="@load(vm.partnersDataModel.renderer)"
                              autopaging="true" mold="paging" pagingPosition="top" multiple="false"
                              onSelect="@command('onListSelection')">
                         <listhead sizable="true" menupopup="editPopup"
-                                  children="@bind(vm.partnersDataModel.columnSettings) @template('head-item')">
+                                  onColSize="@command('onHeaderSizeChanged', node=node)"
+                                  children="@bind(vm.partnersDataModel.renderer.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)"/>
+                                            visible="@load(node.visible)" width="@load(node.width)" draggable="head"
+                                            droppable="head" sortDirection="@load(node.sortDirection)"
+                                            onDrop="@command('onHeaderReorder')"/>
                             </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">
                             <listitem onDoubleClick="@command('onEdit')">