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;
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;
@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);
}
Profile columnProfile = Profile.builder()
.login(currentProfile.getAssociate().getLogin())
.type(getClass().getSimpleName())
- .setting(entityDataService.toJSON(columnSettings))
+ .setting(entityDataService.toJSON(renderer.getColumnSettings()))
.build();
currentProfile.persistSetting(columnProfile);
}
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 {
}
});
saveProfileSetting();
- log.info("Sort settings for {} : {}", getClass().getSimpleName(), columnSettings);
+ //log.info("Sort settings for {} : {}", getClass().getSimpleName(), columnSettings);
}
public void onHeaderMenuClicked(ColDef node) {
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);
+ }
+
}
@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
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;
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));
+// }
+
+ }
+
+
}
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
}
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
--- /dev/null
+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();
+ }
+
+ }
+
+}
<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')">