--- /dev/null
+
+/*
+ * Copyright (c) $today.year-$today.month-24.
+ * By elGekko
+ */
+
+package hu.user.lis;
+
+import lombok.extern.log4j.Log4j2;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.junit4.SpringRunner;
+
+
+@Log4j2
+@RunWith(SpringRunner.class)
+@ComponentScan("hu.user.lis")
+@SpringBootTest
+public class EventIT {
+ @Test
+ public void testSaveEntityEvent() {
+ String data = "";
+ }
+
+
+}
--- /dev/null
+-- // add document type, reference_id to edocument
+-- Migration SQL that makes the change goes here.
+
+ALTER TABLE edocument
+ ADD COLUMN document_type VARCHAR(50) NOT NULL DEFAULT ''
+ ADD COLUMN reference_id BIGINT
+ ALTER COLUMN created SET NOT NULL;
+
+CALL SYSPROC.ADMIN_CMD('REORG TABLE edocument');
+
+CREATE INDEX IDX_EDOCUMENT_REFERENCE_ID_DOCUMENT_TYPE ON edocument(reference_id, document_type);
+
+-- //@UNDO
+-- SQL to undo the change goes here.
+
+DROP INDEX IDX_EDOCUMENT_REFERENCE_ID_DOCUMENT_TYPE;
+
+ALTER TABLE edocument
+ DROP COLUMN document_type
+ DROP COLUMN reference_id
+ ALTER COLUMN created DROP NOT NULL;
+CALL SYSPROC.ADMIN_CMD('REORG TABLE edocument');
package hu.user.lis.db;
import lombok.*;
+import org.hibernate.annotations.CreationTimestamp;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
+import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
public class EDocument implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
- Long id;
- Date created;
- String name;
- String description;
- int size;
- byte[] file;
+ private Long id;
+
+ @Column(nullable = false)
+ private Long referenceId;
+
+ @Column(nullable = false)
+ private String documentType;
+
+ @Column(updatable = false)
+ @CreationTimestamp
+ private Date created;
+
+ private String description;
+
+ private int size;
+
+ @Column(nullable = false)
+ private byte[] file;
+
+ @Column(nullable = false)
+ private String name;
}
public class ServiceRecord implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
- Long id;
+ private Long id;
+
@ManyToOne
@JoinColumn(name = "project_id")
@JsonIncludeProperties({"id"})
- Project project;
+ private Project project;
+
@ManyToOne
@JoinColumn(name = "associate_id")
@JsonIncludeProperties({"id"})
- Associate associate;
- Date workDay;
- String description;
- String details;
- int workHours;
- double cost;
- byte[] file;
+ private Associate associate;
+
+ private Date workDay;
+
+ private String description;
+
+ private String details;
+
+ private int workHours;
+
+ private double cost;
+
+ private byte[] file;
}
--- /dev/null
+package hu.user.lis.db.repository;
+
+import hu.user.lis.db.EDocument;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface EDocumentRepository extends JpaRepository<EDocument, Long> {
+ List<EDocument> findByReferenceIdAndDocumentType(Long referenceId, String documentType);
+
+}
if (Objects.isNull(data)) {
return null;
}
- return new AMedia("Számlakép", "pdf", "application/pdf", data);
+ return new AMedia("Attachment", "pdf", "application/pdf", data);
}
@Override
import java.util.List;
-@Component
@Log4j2
+@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class AssociateSelectorDataModel extends CachedSpringDataModel<Associate> {
static private final int SEARCH_LIMIT = 10;
--- /dev/null
+package hu.user.lis.ui.data;
+
+import hu.user.lis.db.EDocument;
+import hu.user.lis.db.repository.EDocumentRepository;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.zkoss.zul.ListModelList;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@Log4j2
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class EntityDocumentDataModel extends ListModelList<EDocument> {
+ private final List<EDocument> added = new ArrayList<>();
+ private final List<EDocument> removed = new ArrayList<>();
+ @Autowired
+ private EDocumentRepository eDocumentRepository;
+
+
+ public EDocument refresh(Long referenceId, String documentType) {
+ EDocument result = null;
+ clear();
+ List<EDocument> documents = eDocumentRepository.findByReferenceIdAndDocumentType(referenceId, documentType);
+ addAll(documents);
+ if (!documents.isEmpty()) {
+ result = documents.stream().findFirst().get();
+ }
+ return result;
+ }
+
+ public void addNew(EDocument document) {
+ added.add(document);
+// selectedDocument = document;
+ add(document);
+ }
+
+ public void remove() {
+ Set<EDocument> documents = getSelection();
+ if (documents.isEmpty()) {
+ return;
+ }
+ removed.addAll(documents);
+// clearSelection();
+// selectedDocument = null;
+ removeAll(documents);
+ }
+
+ public void save(Long entityId) {
+ eDocumentRepository.deleteAll(removed);
+ added.forEach(d -> d.setReferenceId(entityId));
+ eDocumentRepository.saveAll(added);
+ }
+
+ public boolean isChanged() {
+ return !added.isEmpty() || !removed.isEmpty();
+ }
+}
import hu.user.lis.ui.editor.common.Editors;
import hu.user.lis.ui.editor.validator.FormValidator;
import hu.user.lis.ui.editor.validator.ImportInvoiceApproveFormValidator;
+import hu.user.lis.ui.event.SaveEntityEvent;
import hu.user.lis.workflow.invoice.data.InvoiceImportStatus;
import lombok.Getter;
import lombok.Setter;
@Command
public void onEditPartner() {
Partner entity = partnersDataModel.clone(getFormDocument().getPartner());
- Editors.doEdit(Editors.PARTNER, entity, modifiedEntity -> getFormDocument().setPartner(modifiedEntity));
+ Editors.doEdit(Editors.PARTNER, entity, this::handleEntitySaveEvent);
}
+ public void handleEntitySaveEvent(SaveEntityEvent<Partner> event) {
+ if (!event.isCanceled()) {
+ getFormDocument().setPartner(event.getData());
+ }
+ }
+
+
@Command
public void onCloseApproveWindow(@BindingParam("target") Window target, @BindingParam("status") InvoiceImportStatus status) {
if (InvoiceImportStatus.NONE.equals(status)) {
import hu.user.lis.ui.editor.common.Editors;
import hu.user.lis.ui.editor.validator.FormValidator;
import hu.user.lis.ui.editor.validator.ImportInvoiceAssignFormValidator;
+import hu.user.lis.ui.event.SaveEntityEvent;
import hu.user.lis.workflow.invoice.data.InvoiceImportStatus;
import lombok.Getter;
import lombok.Setter;
@Command
public void onEditPartner() {
Partner entity = partnersDataModel.clone(getFormDocument().getPartner());
- Editors.doEdit(Editors.PARTNER, entity, modifiedEntity -> getFormDocument().setPartner(modifiedEntity));
+ Editors.doEdit(Editors.PARTNER, entity, this::handleEntitySaveEvent);
+ }
+
+ public void handleEntitySaveEvent(SaveEntityEvent<Partner> event) {
+ if (!event.isCanceled()) {
+ getFormDocument().setPartner(event.getData());
+ }
}
@Command
import hu.user.lis.ui.editor.common.EntityEditorModel;
import hu.user.lis.ui.editor.validator.FormValidator;
import hu.user.lis.ui.editor.validator.ProjectFormValidator;
+import hu.user.lis.ui.event.SaveEntityEvent;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
@Command
public void onAddIncoming() {
IncomingInvoice entity = invoiceDataModel.createNewIncomingInvoice();
- Editors.doEdit(Editors.INCOMING_INVOICE, entity, modifiedEntity -> {
+ Editors.doEdit(Editors.INCOMING_INVOICE, entity, this::incomingAdded);
+ }
+
+ @Command
+ public void onEditIncoming() {
+ IncomingInvoice entity = invoiceDataModel.clone(selectedIncomingInvoice);
+ Editors.doEdit(Editors.INCOMING_INVOICE, entity, selectedIncomingInvoice, this::incomingModified);
+ }
+
+ private void incomingAdded(SaveEntityEvent<IncomingInvoice> event) {
+ if (!event.isCanceled()) {
+ IncomingInvoice modifiedEntity = event.getData();
getFormDocument().getIncomingInvoices().add(modifiedEntity);
selectedIncomingInvoice = modifiedEntity;
validate();
BindUtils.postNotifyChange(this, "selectedIncomingInvoice");
BindUtils.postNotifyChange(getFormDocument(), "incomingInvoices");
- });
+ }
}
- @Command
- public void onEditIncoming() {
- IncomingInvoice entity = invoiceDataModel.clone(selectedIncomingInvoice);
- Editors.doEdit(Editors.INCOMING_INVOICE, entity, selectedIncomingInvoice, modifiedEntity -> {
+ private void incomingModified(SaveEntityEvent<IncomingInvoice> event) {
+ if (!event.isCanceled()) {
Set<IncomingInvoice> incomingInvoices = getFormDocument().getIncomingInvoices();
incomingInvoices.remove(selectedIncomingInvoice);
+ IncomingInvoice modifiedEntity = event.getData();
incomingInvoices.add(modifiedEntity);
selectedIncomingInvoice = modifiedEntity;
validate();
BindUtils.postNotifyChange(this, "selectedIncomingInvoice");
BindUtils.postNotifyChange(getFormDocument(), "incomingInvoices");
- });
+ }
}
@Command
@Command
public void onAddOutgoing() {
OutgoingInvoice entity = invoiceDataModel.createNewOutgoingInvoice();
- Editors.doEdit(Editors.OUTGOING_INVOICE, entity, modifiedEntity -> {
+ Editors.doEdit(Editors.OUTGOING_INVOICE, entity, this::outgoingAdded);
+ }
+
+ @Command
+ public void onEditOutgoing() {
+ OutgoingInvoice entity = invoiceDataModel.clone(selectedOutgoingInvoice);
+ Editors.doEdit(Editors.OUTGOING_INVOICE, entity, this::outgoingModified);
+ }
+
+ private void outgoingAdded(SaveEntityEvent<OutgoingInvoice> event) {
+ if (!event.isCanceled()) {
+ OutgoingInvoice modifiedEntity = event.getData();
getFormDocument().getOutgoingInvoices().add(modifiedEntity);
selectedOutgoingInvoice = modifiedEntity;
validate();
BindUtils.postNotifyChange(this, "selectedOutgoingInvoice");
BindUtils.postNotifyChange(getFormDocument(), "outgoingInvoices");
- });
+ }
}
- @Command
- public void onEditOutgoing() {
- OutgoingInvoice entity = invoiceDataModel.clone(selectedOutgoingInvoice);
- Editors.doEdit(Editors.OUTGOING_INVOICE, entity, selectedOutgoingInvoice, modifiedEntity -> {
+ private void outgoingModified(SaveEntityEvent<OutgoingInvoice> event) {
+ if (!event.isCanceled()) {
+ OutgoingInvoice modifiedEntity = event.getData();
Set<OutgoingInvoice> outgoingInvoices = getFormDocument().getOutgoingInvoices();
outgoingInvoices.remove(selectedOutgoingInvoice);
outgoingInvoices.add(modifiedEntity);
validate();
BindUtils.postNotifyChange(this, "selectedOutgoingInvoice");
BindUtils.postNotifyChange(getFormDocument(), "outgoingInvoices");
- });
+ }
}
@Command
@Command
public void onAddTreasury() {
Treasury entity = treasuryDataModel.createNew();
- Editors.doEdit(Editors.TREASURY, entity, modifiedEntity -> {
+ Editors.doEdit(Editors.TREASURY, entity, this::treasuryAdded);
+ }
+
+ @Command
+ public void onEditTreasury() {
+ Treasury entity = treasuryDataModel.clone(selectedTreasury);
+ Editors.doEdit(Editors.TREASURY, entity, selectedTreasury, this::treasuryModified);
+ }
+
+ private void treasuryAdded(SaveEntityEvent<Treasury> event) {
+ if (!event.isCanceled()) {
+ Treasury modifiedEntity = event.getData();
getFormDocument().getTreasuries().add(modifiedEntity);
selectedTreasury = modifiedEntity;
validate();
BindUtils.postNotifyChange(this, "selectedTreasury");
BindUtils.postNotifyChange(getFormDocument(), "treasuries");
- });
+ }
}
- @Command
- public void onEditTreasury() {
- Treasury entity = treasuryDataModel.clone(selectedTreasury);
- Editors.doEdit(Editors.TREASURY, entity, selectedTreasury, modifiedEntity -> {
+ private void treasuryModified(SaveEntityEvent<Treasury> event) {
+ if (!event.isCanceled()) {
+ Treasury modifiedEntity = event.getData();
Set<Treasury> treasuries = getFormDocument().getTreasuries();
treasuries.remove(selectedTreasury);
treasuries.add(modifiedEntity);
validate();
BindUtils.postNotifyChange(this, "selectedTreasury");
BindUtils.postNotifyChange(getFormDocument(), "treasuries");
- });
+ }
}
@Command
import hu.user.lis.db.ServiceRecord;
import hu.user.lis.ui.auth.CurrentProfile;
import hu.user.lis.ui.data.ProjectAssociatesDataModel;
-import hu.user.lis.ui.editor.common.EntityEditorModel;
+import hu.user.lis.ui.editor.common.EntityAttachmentEditorModel;
import hu.user.lis.ui.editor.selector.EntitySelectorModel;
import hu.user.lis.ui.editor.validator.FormValidator;
import hu.user.lis.ui.editor.validator.ServiceRecordFormValidator;
+import hu.user.lis.ui.event.CancelEntityEditEvent;
+import hu.user.lis.ui.event.SaveEntityWithAttachmentEvent;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
-import org.zkoss.bind.BindContext;
-import org.zkoss.bind.BindUtils;
import org.zkoss.bind.PropertyChangeEvent;
import org.zkoss.bind.annotation.*;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.Events;
-import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;
@Log4j2
@Getter
@Setter
-public class ServiceRecordEditorModel extends EntityEditorModel<ServiceRecord> {
+public class ServiceRecordEditorModel extends EntityAttachmentEditorModel<ServiceRecord> {
@WireVariable
- CurrentProfile currentProfile;
+ private CurrentProfile currentProfile;
@WireVariable
- ProjectAssociatesDataModel projectAssociatesDataModel;
-
- private EntitySelectorModel<?> projectEntitySelectorModel;
+ private ProjectAssociatesDataModel projectAssociatesDataModel;
@WireVariable
private ServiceRecordFormValidator serviceRecordFormValidator;
+ private EntitySelectorModel<?> projectEntitySelectorModel;
+
@Override
public FormValidator<ServiceRecord> getFormValidator() {
return serviceRecordFormValidator;
@Override
public void init() {
super.init();
+ setSelectedDocument(getEntityDocumentDataModel().refresh(getFormDocument().getId(), ServiceRecord.class.getSimpleName()));
}
@AfterCompose
@Override
public void onCloseWindow(@BindingParam("target") Window target, @BindingParam("save") boolean save) {
if (save) {
- Optional<ProjectAssociate> opProjectAssociate = projectAssociatesDataModel.searchByAssociateAndProject(getFormDocument().getAssociate().getId(),
- getFormDocument().getProject().getId());
- if (opProjectAssociate.isPresent()) {
- doSave(target);
- } else {
- Messagebox.show("A munkatárs a kiválasztott projekt résztvevője lesz.", "Megerősítés",
- Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION, e -> {
- if (!e.getName().equals("onCancel")) {
- projectAssociatesDataModel.addProjectAssociate(getFormDocument().getProject(), getFormDocument().getAssociate());
- doSave(target);
- }
- });
+ if (isSaveEnabled()) {
+ Optional<ProjectAssociate> opProjectAssociate = projectAssociatesDataModel.searchByAssociateAndProject(getFormDocument().getAssociate().getId(),
+ getFormDocument().getProject().getId());
+ if (opProjectAssociate.isPresent()) {
+ Events.postEvent(new SaveEntityWithAttachmentEvent<>(getFormDocument(), getEntityDocumentDataModel(), target));
+ } else {
+ Messagebox.show("A munkatárs a kiválasztott projekt résztvevője lesz.", "Megerősítés",
+ Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION, e -> {
+ if (!e.getName().equals("onCancel")) {
+ projectAssociatesDataModel.addProjectAssociate(getFormDocument().getProject(), getFormDocument().getAssociate());
+ Events.postEvent(new SaveEntityWithAttachmentEvent<>(getFormDocument(), getEntityDocumentDataModel(), target));
+ }
+ });
+ }
}
} else {
- Events.postEvent(new Event("onClose", target, null));
- }
- }
-
- private void doSave(Window target) {
- if (isSaveEnabled()) {
- Events.postEvent(new Event("onClose", target, getFormDocument()));
+ Events.postEvent(new CancelEntityEditEvent<>(target));
}
}
return Collections.emptyList();
}
- @Override
- protected boolean canSave(ServiceRecord entity) {
- return serviceRecordFormValidator.validate(entity);
- }
-
- @Command
- public void onUploadFile(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) {
- UploadEvent evt = (UploadEvent) ctx.getTriggerEvent();
- if (!evt.getMedia().getName().toLowerCase().endsWith(".pdf")) {
- Messagebox.show("Csak PDF állomány feltöltése támogatott.", "Error", Messagebox.OK, Messagebox.ERROR);
- return;
- }
- getFormDocument().setFile(evt.getMedia().getByteData());
- BindUtils.postNotifyChange(getFormDocument(), "file");
- validate();
- }
-
- @Command
- public void onRemoveFile() {
- getFormDocument().setFile(null);
- BindUtils.postNotifyChange(getFormDocument(), "file");
- validate();
- }
-
@Override
public void onEvent(Event evt) {
if (isEventForCurrentDocument(evt)) {
--- /dev/null
+package hu.user.lis.ui.editor.common;
+
+import hu.user.lis.ui.event.SaveEntityEvent;
+
+public interface EditCompletedListener<E> {
+
+ void handle(SaveEntityEvent<E> entity);
+
+}
package hu.user.lis.ui.editor.common;
import com.google.common.collect.ImmutableMap;
+import hu.user.lis.ui.event.SaveEntityEvent;
+import lombok.extern.log4j.Log4j2;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zul.Window;
import java.util.Map;
import java.util.Objects;
+@Log4j2
public class Editors {
public static final String SERVICE_RECORD = "~./editor/service-record-editor.zul";
public static final String INCOMING_INVOICE = "~./editor/incoming-invoice-editor.zul";
public static final String INVOICE_PAYMENT = "~./invoice-payment.zul";
public static final String POPUP_EDITOR = "~./editor/popup-editor.zul";
- public static <E> void doEdit(String page, E entity, EditCompleted<E> editCompleted) {
+ public static <E> void doEdit(String page, E entity, EditCompletedListener<E> editCompleted) {
doEdit(page, entity, null, editCompleted);
}
- public static <E> void doEdit(String page, E entity, E original, EditCompleted<E> editCompleted) {
+ public static <E> void doEdit(String page, E entity, E original, EditCompletedListener<E> editCompleted) {
Map<String, Object> arg;
if (Objects.isNull(entity)) {
//header double click
doShowEdit(page, arg, editCompleted);
}
- public static <E> void doShowEdit(String page, Map<String, Object> arg, EditCompleted<E> editCompleted) {
+ public static <E> void doShowEdit(String page, Map<String, Object> arg, EditCompletedListener<E> editCompleted) {
Window editorWindow = (Window) Executions.createComponents(page, null, arg);
editorWindow.addEventListener("onClose", e -> {
- if (e.getData() != null) {
- editCompleted.done((E) e.getData());
+ if (e instanceof SaveEntityEvent) {
+ editCompleted.handle((SaveEntityEvent<E>) e);
+ } else {
+ log.error("Internal error! Expected event type is SaveEntityEvent");
}
});
editorWindow.doModal();
editorWindow.setFocus(true);
}
+
}
--- /dev/null
+package hu.user.lis.ui.editor.common;
+
+import hu.user.lis.db.EDocument;
+import hu.user.lis.ui.data.EntityDocumentDataModel;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.log4j.Log4j2;
+import org.zkoss.bind.BindContext;
+import org.zkoss.bind.BindUtils;
+import org.zkoss.bind.annotation.Command;
+import org.zkoss.bind.annotation.ContextParam;
+import org.zkoss.bind.annotation.ContextType;
+import org.zkoss.lang.Strings;
+import org.zkoss.zk.ui.event.UploadEvent;
+import org.zkoss.zk.ui.select.annotation.WireVariable;
+import org.zkoss.zul.Messagebox;
+
+import java.io.Serializable;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+@Log4j2
+public class EntityAttachmentEditorModel<T extends Serializable> extends EntityEditorModel<T> {
+
+ @Getter
+ @WireVariable
+ private EntityDocumentDataModel entityDocumentDataModel;
+
+ @Getter
+ @Setter
+ private EDocument selectedDocument;
+
+ protected boolean canSave(T entity) {
+ return true;
+ }
+
+ @Command
+ public void onUploadFile(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) {
+ UploadEvent evt = (UploadEvent) ctx.getTriggerEvent();
+ if (!evt.getMedia().getName().toLowerCase().endsWith(".pdf")) {
+ Messagebox.show("Csak PDF állomány feltöltése támogatott.", "Error", Messagebox.OK, Messagebox.ERROR);
+ return;
+ }
+ String documentType = Strings.EMPTY;
+ Type[] actualTypeArguments = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
+ if (actualTypeArguments.length > 0) {
+ documentType = ((Class<?>) actualTypeArguments[0]).getSimpleName();
+ }
+ EDocument document = EDocument.builder()
+ .documentType(documentType)
+ .file(evt.getMedia().getByteData())
+ .size(evt.getMedia().getByteData().length)
+ .name(evt.getMedia().getName())
+ .build();
+ entityDocumentDataModel.addNew(document);
+ BindUtils.postNotifyChange(entityDocumentDataModel, "*");
+ validate();
+ }
+
+ @Command
+ public void onRemoveFile() {
+ entityDocumentDataModel.remove();
+ BindUtils.postNotifyChange(entityDocumentDataModel, "*");
+ validate();
+ }
+
+// @Command
+// public void onSelectFile(@BindingParam("selectedDocument") EDocument selectedDocument) {
+// entityDocumentDataModel.clearSelection();
+// entityDocumentDataModel.addToSelection(selectedDocument);
+// entityDocumentDataModel.setSelectedDocument(selectedDocument);
+// }
+
+ @Override
+ protected boolean areDifferent(T entity) {
+ return super.areDifferent(entity) || entityDocumentDataModel.isChanged();
+ }
+
+}
import hu.user.lis.service.data.EntityDataService;
import hu.user.lis.ui.editor.selector.EntitySelectorRouter;
import hu.user.lis.ui.editor.validator.FormValidator;
+import hu.user.lis.ui.event.CancelEntityEditEvent;
import hu.user.lis.ui.event.EventBus;
+import hu.user.lis.ui.event.SaveEntityEvent;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
public void onCloseWindow(@BindingParam("target") Window target, @BindingParam("save") boolean save) {
if (save) {
if (saveEnabled) {
- Events.postEvent(new Event("onClose", target, formDocument));
+ Events.postEvent(new SaveEntityEvent<>(formDocument, target));
}
} else {
- Events.postEvent(new Event("onClose", target, null));
+ Events.postEvent(new CancelEntityEditEvent<>(target));
}
}
eventBus.registerForBinding(this);
origDocument = (T) Executions.getCurrent().getArg().get("origDocument");
formDocument = (T) Executions.getCurrent().getArg().get("formDocument");
- if (Objects.nonNull(getFormValidator()) && Objects.nonNull(getFormDocument())) {
- getFormValidator().validate(getFormDocument());
- }
+ validate(formDocument);
}
@Override
}
}
- protected abstract boolean canSave(T entity);
+ protected boolean canSave(T entity) {
+ boolean result = false;
+ if (Objects.nonNull(getFormValidator())) {
+ getFormValidator().validate(entity);
+ }
+ return result;
+ }
protected boolean areDifferent(T entity) {
return entityDataService.areDifferent(origDocument, entity);
--- /dev/null
+package hu.user.lis.ui.event;
+
+import lombok.Getter;
+import org.zkoss.zul.Window;
+
+@Getter
+public class CancelEntityEditEvent<T> extends SaveEntityEvent<T> {
+
+ public CancelEntityEditEvent(Window target) {
+ super(null, target);
+ }
+}
--- /dev/null
+package hu.user.lis.ui.event;
+
+import org.zkoss.zk.ui.event.Event;
+import org.zkoss.zul.Window;
+
+public class SaveEntityEvent<T> extends Event {
+
+ public SaveEntityEvent(T data, Window target) {
+ super("onClose", target, data);
+ }
+
+ @Override
+ public T getData() {
+ return (T) super.getData();
+ }
+
+ public boolean isCanceled() {
+ return this instanceof CancelEntityEditEvent;
+ }
+
+ public SaveEntityWithAttachmentEvent<T> withAttachment() {
+ if (this instanceof SaveEntityWithAttachmentEvent) {
+ return (SaveEntityWithAttachmentEvent<T>) this;
+ }
+ return null;
+ }
+}
--- /dev/null
+package hu.user.lis.ui.event;
+
+import hu.user.lis.ui.data.EntityDocumentDataModel;
+import lombok.Getter;
+import org.zkoss.zul.Window;
+
+@Getter
+public class SaveEntityWithAttachmentEvent<T> extends SaveEntityEvent<T> {
+
+ private final EntityDocumentDataModel entityDocumentDataModel;
+
+ public SaveEntityWithAttachmentEvent(T data, EntityDocumentDataModel entityDocumentDataModel, Window target) {
+ super(data, target);
+ this.entityDocumentDataModel = entityDocumentDataModel;
+ }
+}
import hu.user.lis.ui.data.AssociatesDataModel;
import hu.user.lis.ui.data.common.CachedSpringDataModel;
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;
@Command
public void onAdd() {
Associate entity = associatesDataModel.createNew();
- Editors.doEdit(Editors.ASSOCIATE, entity, modifiedEntity -> {
- associatesDataModel.save(modifiedEntity);
- refresh();
- associatesDataModel.addToSelection(modifiedEntity);
- });
+ Editors.doEdit(Editors.ASSOCIATE, entity, this::saveAssociate);
}
@Command
public void onEdit() {
Associate entity = associatesDataModel.clone(getSelectedEntity());
- Editors.doEdit(Editors.ASSOCIATE, entity, getSelectedEntity(), modifiedEntity -> {
+ Editors.doEdit(Editors.ASSOCIATE, entity, getSelectedEntity(), this::saveAssociate);
+ }
+
+ private void saveAssociate(SaveEntityEvent<Associate> event) {
+ if (!event.isCanceled()) {
+ Associate modifiedEntity = event.getData();
associatesDataModel.save(modifiedEntity);
refresh();
- });
+ associatesDataModel.addToSelection(modifiedEntity);
+ }
}
@Command
import hu.user.lis.ui.editor.common.Editors;
import hu.user.lis.ui.editor.selector.EntitySelectorRouter;
import hu.user.lis.ui.event.EventBus;
+import hu.user.lis.ui.event.SaveEntityEvent;
import hu.user.lis.ui.view.common.EntityViewModel;
import hu.user.lis.workflow.invoice.service.WorkflowManagerService;
import lombok.Getter;
public void onEditIncoming() {
IncomingInvoice selectedIncomingInvoice = (IncomingInvoice) getSelectedEntity();
IncomingInvoice entity = invoiceDataModel.clone(selectedIncomingInvoice);
- Editors.doEdit(Editors.INCOMING_INVOICE, entity, selectedIncomingInvoice, modifiedEntity -> {
+ Editors.doEdit(Editors.INCOMING_INVOICE, entity, selectedIncomingInvoice, this::saveIncomingInvoice);
+ }
+
+ private void saveIncomingInvoice(SaveEntityEvent<IncomingInvoice> event) {
+ if (!event.isCanceled()) {
+ Invoice modifiedEntity = event.getData();
invoiceDataModel.save(modifiedEntity);
refresh();
- });
+ }
}
public void onEditOutgoing() {
OutgoingInvoice selectedOutgoingInvoice = (OutgoingInvoice) getSelectedEntity();
OutgoingInvoice entity = invoiceDataModel.clone((OutgoingInvoice) getSelectedEntity());
- Editors.doEdit(Editors.OUTGOING_INVOICE, entity, selectedOutgoingInvoice, modifiedEntity -> {
+ Editors.doEdit(Editors.OUTGOING_INVOICE, entity, selectedOutgoingInvoice, this::saveOutgoingInvoice);
+ }
+
+ private void saveOutgoingInvoice(SaveEntityEvent<OutgoingInvoice> event) {
+ if (!event.isCanceled()) {
+ Invoice modifiedEntity = event.getData();
invoiceDataModel.save(modifiedEntity);
refresh();
- });
+ }
}
@Command
import hu.user.lis.ui.editor.common.Editors;
import hu.user.lis.ui.editor.selector.EntitySelectorRouter;
import hu.user.lis.ui.event.EventBus;
+import hu.user.lis.ui.event.SaveEntityEvent;
import hu.user.lis.ui.view.common.EntityViewModel;
import lombok.Getter;
import lombok.extern.log4j.Log4j2;
public void onEditIncoming() {
IncomingInvoice selectedIncomingInvoice = (IncomingInvoice) getSelectedEntity();
IncomingInvoice entity = invoiceDataModel.clone(selectedIncomingInvoice);
- Editors.doEdit(Editors.INCOMING_INVOICE, entity, selectedIncomingInvoice, modifiedEntity -> {
+ Editors.doEdit(Editors.INCOMING_INVOICE, entity, selectedIncomingInvoice, this::saveIncomingInvoice);
+ }
+
+ private void saveIncomingInvoice(SaveEntityEvent<IncomingInvoice> event) {
+ if (!event.isCanceled()) {
+ Invoice modifiedEntity = event.getData();
invoiceDataModel.save(modifiedEntity);
refresh();
- });
+ }
}
public void onEditOutgoing() {
OutgoingInvoice selectedOutgoingInvoice = (OutgoingInvoice) getSelectedEntity();
OutgoingInvoice entity = invoiceDataModel.clone((OutgoingInvoice) getSelectedEntity());
- Editors.doEdit(Editors.OUTGOING_INVOICE, entity, selectedOutgoingInvoice, modifiedEntity -> {
+ Editors.doEdit(Editors.OUTGOING_INVOICE, entity, selectedOutgoingInvoice, this::saveOutgoingInvoice);
+ }
+
+ private void saveOutgoingInvoice(SaveEntityEvent<OutgoingInvoice> event) {
+ if (!event.isCanceled()) {
+ Invoice modifiedEntity = event.getData();
invoiceDataModel.save(modifiedEntity);
refresh();
- });
+ }
}
@Command
public void onChangeProject() {
- Editors.doEdit(Editors.PROJECT_ATTACH, getSelectedEntity().getProject(), null, modifiedEntity -> {
- if (modifiedEntity != null) {
- getSelectedEntity().setProject(modifiedEntity);
- invoiceDataModel.save(getSelectedEntity());
- refresh();
- }
- });
+ Editors.doEdit(Editors.PROJECT_ATTACH, getSelectedEntity().getProject(), null, this::attachProject);
+ }
+ private void attachProject(SaveEntityEvent<Project> event) {
+ if (!event.isCanceled()) {
+ Project modifiedEntity = event.getData();
+ getSelectedEntity().setProject(modifiedEntity);
+ invoiceDataModel.save(getSelectedEntity());
+ refresh();
+ }
}
@Command
import hu.user.lis.ui.data.PartnersDataModel;
import hu.user.lis.ui.data.common.CachedSpringDataModel;
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;
@Command
public void onAdd() {
Partner entity = partnersDataModel.createNew();
- Editors.doEdit(Editors.PARTNER, entity, modifiedEntity -> {
- partnersDataModel.save(modifiedEntity);
- refresh();
- partnersDataModel.addToSelection(modifiedEntity);
- });
+ Editors.doEdit(Editors.PARTNER, entity, this::savePartner);
}
@Command
public void onEdit() {
Partner entity = partnersDataModel.clone(getSelectedEntity());
- Editors.doEdit(Editors.PARTNER, entity, getSelectedEntity(), modifiedEntity -> {
+ Editors.doEdit(Editors.PARTNER, entity, getSelectedEntity(), this::savePartner);
+ }
+
+ private void savePartner(SaveEntityEvent<Partner> event) {
+ if (!event.isCanceled()) {
+ Partner modifiedEntity = event.getData();
partnersDataModel.save(modifiedEntity);
refresh();
- });
+ partnersDataModel.addToSelection(modifiedEntity);
+ }
}
@Command
import hu.user.lis.ui.data.ProjectsDataModel;
import hu.user.lis.ui.data.common.CachedSpringDataModel;
import hu.user.lis.ui.event.EventBus;
+import hu.user.lis.ui.event.SaveEntityEvent;
import hu.user.lis.ui.view.common.FilterActiveViewModel;
import lombok.Getter;
import lombok.extern.log4j.Log4j2;
));
}
+ public void saveEntity(SaveEntityEvent<Project> event) {
+
+ }
+
protected void refresh() {
projectsDataModel.clearSelection();
setSelectedEntity(null);
import hu.user.lis.db.Project;
import hu.user.lis.db.ServiceRecord;
import hu.user.lis.ui.Constants;
+import hu.user.lis.ui.data.EntityDocumentDataModel;
import hu.user.lis.ui.data.ServiceRecordsDataModel;
import hu.user.lis.ui.data.common.CachedSpringDataModel;
import hu.user.lis.ui.editor.common.Editors;
import hu.user.lis.ui.editor.selector.EntitySelectorRouter;
import hu.user.lis.ui.event.EventBus;
+import hu.user.lis.ui.event.SaveEntityEvent;
import hu.user.lis.ui.view.common.EntityViewModel;
import lombok.Getter;
import lombok.extern.log4j.Log4j2;
@Command
public void onAdd() {
ServiceRecord entity = serviceRecordsDataModel.createNew();
- Editors.doEdit(Editors.SERVICE_RECORD, entity, modifiedEntity -> {
- serviceRecordsDataModel.save(modifiedEntity);
- refresh();
- serviceRecordsDataModel.addToSelection(modifiedEntity);
- });
+ Editors.doEdit(Editors.SERVICE_RECORD, entity, this::saveServiceRecord);
}
@Command
public void onEdit() {
ServiceRecord entity = serviceRecordsDataModel.clone(getSelectedEntity());
- Editors.doEdit(Editors.SERVICE_RECORD, entity, getSelectedEntity(), modifiedEntity -> {
+ Editors.doEdit(Editors.SERVICE_RECORD, entity, getSelectedEntity(), this::saveServiceRecord);
+ }
+
+ public void saveServiceRecord(SaveEntityEvent<ServiceRecord> event) {
+ if (!event.isCanceled()) {
+ ServiceRecord modifiedEntity = event.getData();
serviceRecordsDataModel.save(modifiedEntity);
+ EntityDocumentDataModel entityDocumentDataModel = event.withAttachment().getEntityDocumentDataModel();
+ entityDocumentDataModel.save(modifiedEntity.getId());
refresh();
- });
+ serviceRecordsDataModel.addToSelection(modifiedEntity);
+ }
}
@Command
</vlayout>
</tabpanel>
<tabpanel>
- <borderlayout>
- <north flex="true">
- <toolbar>
- <toolbarbutton label="Feltöltés" iconSclass="z-icon-plus" upload="true"
- onUpload="@command('onUploadFile')"/>
- <toolbarbutton label="Törlés" iconSclass="z-icon-remove"
- onClick="@command('onRemoveFile')"
- disabled="@load(empty vm.formDocument.file)"/>
- </toolbar>
- </north>
- <center border="none" flex="true">
- <iframe hflex="true" vflex="true"
- content="@load(vm.formDocument.file) @converter('hu.user.lis.ui.converter.ByteArrayToAMediaConverter')"/>
- </center>
- </borderlayout>
+ <include src="~./form/attachment-form.zul" hflex="true" vflex="true"/>
</tabpanel>
</tabpanels>
</tabbox>
--- /dev/null
+<zk>
+ <borderlayout>
+ <north flex="true">
+ <toolbar>
+ <toolbarbutton label="Feltöltés" iconSclass="z-icon-plus" upload="true"
+ onUpload="@command('onUploadFile')"/>
+ <toolbarbutton label="Törlés" iconSclass="z-icon-remove"
+ onClick="@command('onRemoveFile')"
+ disabled="@load(empty vm.selectedDocument)"/>
+ </toolbar>
+ </north>
+ <west title="Fájlok" size="25%" flex="true" border="none" splittable="true" collapsible="true">
+ <listbox vflex="true" hflex="true" model="@load(vm.entityDocumentDataModel)" multiple="false"
+ sizedByContent="true" selectedItem="@bind(vm.selectedDocument)">
+ <listhead visible="false">
+ <listheader hflex="true"/>
+ </listhead>
+ <template name="model">
+ <listitem>
+ <listcell>
+ <button iconSclass="z-icon-file-pdf-o"/>
+ <label value="@load(each.name)"/>
+ </listcell>
+ </listitem>
+ </template>
+ </listbox>
+ </west>
+ <center border="none" hflex="true" vflex="true">
+ <iframe hflex="true" vflex="true"
+ content="@load(vm.selectedDocument.file) @converter('hu.user.lis.ui.converter.ByteArrayToAMediaConverter')"/>
+ </center>
+ </borderlayout>
+</zk>
\ No newline at end of file