From fbbf75db81a72271fc7464c4eb85430f700e2caa Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Mon, 26 Feb 2024 16:05:25 +0100 Subject: [PATCH] Reorder Partners columns --- .../ui/data/common/CachedSpringDataModel.java | 43 +++++-- .../hu/user/lis/ui/data/common/ColDef.java | 2 + .../user/lis/ui/view/PartnersViewModel.java | 34 ++++- .../lis/ui/view/common/EntityViewModel.java | 16 +-- .../view/renderer/ReorderedItemsRenderer.java | 121 ++++++++++++++++++ lis-ui/src/main/resources/web/partners.zul | 21 +-- 6 files changed, 201 insertions(+), 36 deletions(-) create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/view/renderer/ReorderedItemsRenderer.java diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/common/CachedSpringDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/common/CachedSpringDataModel.java index 56e55ea..d9f9aed 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/data/common/CachedSpringDataModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/common/CachedSpringDataModel.java @@ -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 extends CachedDataModel { - @Getter - @Setter - ColDef[] columnSettings = {}; + @Autowired + private CurrentProfile currentProfile; @Autowired - CurrentProfile currentProfile; + private EntityDataService entityDataService; + @Getter @Autowired - EntityDataService entityDataService; + private ReorderedItemsRenderer renderer; public void addColumns(List 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 extends CachedDataModel { 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 extends CachedDataModel { 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 extends CachedDataModel { } }); 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 extends CachedDataModel { 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); + } + } 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 index c5d763f..52692d2 100644 --- 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 @@ -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 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 670241d..9179d29 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 @@ -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 { 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)); +// } + + } + + } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java index b45b898..20b6d0f 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java @@ -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 { } protected void addColumns(List colDefs) { - List columns = colDefs.stream().map(colDefStr -> { + int index = 0; + List 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 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 index 0000000..77fadec --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/renderer/ReorderedItemsRenderer.java @@ -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, 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(); + } + + } + +} diff --git a/lis-ui/src/main/resources/web/partners.zul b/lis-ui/src/main/resources/web/partners.zul index bb543a3..4dad406 100644 --- a/lis-ui/src/main/resources/web/partners.zul +++ b/lis-ui/src/main/resources/web/partners.zul @@ -22,32 +22,25 @@
+ children="@bind(vm.partnersDataModel.renderer.columnSettings) @template('menu-item')"> + onColSize="@command('onHeaderSizeChanged', node=node)" + children="@bind(vm.partnersDataModel.renderer.columnSettings) @template('head-item')"> - - - - - - - - - - -