From: elgekko Date: Sat, 29 Jul 2023 21:24:52 +0000 (+0200) Subject: v0.1.3 X-Git-Url: http://git.useribm.hu/?a=commitdiff_plain;h=86f3d828fd0e7a3805c3e6de457ffe4bed7e6186;p=sly-crm.git v0.1.3 --- diff --git a/KB.md b/KB.md index 45f3d9b..2e92b52 100644 --- a/KB.md +++ b/KB.md @@ -89,4 +89,8 @@ https://regex101.com/r/ytlsy4/2 közösségi adószám https://regex101.com/r/itexWd/1 https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s21.html -^(HU)?[0-9]{8}$ \ No newline at end of file +^(HU)?[0-9]{8}$ + +##### Col reorder + +https://stackoverflow.com/questions/14021298/zk-reordering-in-listbox/14021556#14021556 \ No newline at end of file diff --git a/lis-app/pom.xml b/lis-app/pom.xml index 21101b8..665a754 100644 --- a/lis-app/pom.xml +++ b/lis-app/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 lis-app - 0.1.2-SNAPSHOT + 0.1.3-SNAPSHOT hu.user lis diff --git a/lis-app/src/main/resources/application.yaml b/lis-app/src/main/resources/application.yaml index 0607c5e..b62aa04 100644 --- a/lis-app/src/main/resources/application.yaml +++ b/lis-app/src/main/resources/application.yaml @@ -9,7 +9,7 @@ spring: jpa: hibernate: use-new-id-generator-mappings: false - show-sql: false + show-sql: true properties: hibernate: format_sql: true diff --git a/lis-db/migrations/scripts/004_create_test_data.sql b/lis-db/migrations/scripts/004_create_test_data.sql index 2549b12..0da1d67 100644 --- a/lis-db/migrations/scripts/004_create_test_data.sql +++ b/lis-db/migrations/scripts/004_create_test_data.sql @@ -21,7 +21,7 @@ VALUES INSERT INTO PROJECT (ID, PROJECT_STATUS_ID, NAME, HUMAN_ID, CONTACT_NAME, PARTNER_ID, ACTIVE) VALUES - (1, 1, 'Halászat', '2023-01', 'Kovács', 1, 1); + (1, 1, 'Halászat', '2023-0001', 'Kovács', 1, 1); -- //@UNDO diff --git a/lis-services/src/main/java/hu/user/lis/services/data/EntityDataService.java b/lis-services/src/main/java/hu/user/lis/services/data/EntityDataService.java index 6863607..bd57725 100644 --- a/lis-services/src/main/java/hu/user/lis/services/data/EntityDataService.java +++ b/lis-services/src/main/java/hu/user/lis/services/data/EntityDataService.java @@ -10,12 +10,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.Serializable; -import java.lang.reflect.Field; import java.util.Objects; @Log4j2 @Service -public class EntityDataService { +public class EntityDataService extends EntityDataServiceBase { @Autowired ObjectMapper objectMapper; @@ -23,29 +22,12 @@ public class EntityDataService { return SerializationUtils.clone(sourceEntity); } - - private boolean setFieldValue(T entity, Class clazz, String property, Object value) { - boolean result = false; - try { - Field field = clazz.getDeclaredField(property); - field.setAccessible(true); - field.set(entity, value); - result = true; - } catch (Exception e) { - log.error(e); - } - return result; - } - public T clone(T sourceEntity, String property, Object value) { T result = clone(sourceEntity); - if (setFieldValue(result, result.getClass(), property, value)) { - return result; + if (!setFieldValue(result, property, value)) { + result = null; } - if (setFieldValue(result, result.getClass().getSuperclass(), property, value)) { - return result; - } - return null; + return result; } diff --git a/lis-services/src/main/java/hu/user/lis/services/data/EntityDataServiceBase.java b/lis-services/src/main/java/hu/user/lis/services/data/EntityDataServiceBase.java new file mode 100644 index 0000000..4794792 --- /dev/null +++ b/lis-services/src/main/java/hu/user/lis/services/data/EntityDataServiceBase.java @@ -0,0 +1,49 @@ +package hu.user.lis.services.data; + +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Field; +import java.util.Arrays; + +@Log4j2 +@Service +public class EntityDataServiceBase { + + public boolean setFieldValue(Object entity, String property, Object value) { + boolean result = false; + Field field; + try { + boolean hasField = Arrays.stream(entity.getClass().getDeclaredFields()).anyMatch(f -> f.getName().equals(property)); + if (hasField) { + field = entity.getClass().getDeclaredField(property); + } else { + field = entity.getClass().getSuperclass().getDeclaredField(property); + } + field.setAccessible(true); + field.set(entity, value); + result = true; + } catch (Exception e) { + log.error(e); + } + return result; + } + + public Object getFieldValue(Object entity, String property) { + Object result = null; + Field field; + try { + boolean hasField = Arrays.stream(entity.getClass().getDeclaredFields()).anyMatch(f -> f.getName().equals(property)); + if (hasField) { + field = entity.getClass().getDeclaredField(property); + } else { + field = entity.getClass().getSuperclass().getDeclaredField(property); + } + field.setAccessible(true); + result = field.get(entity); + } catch (Exception e) { + log.error(e); + } + return result; + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/Constants.java b/lis-ui/src/main/java/hu/user/lis/ui/Constants.java index 04ef7d4..764deb2 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/Constants.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/Constants.java @@ -2,14 +2,13 @@ package hu.user.lis.ui; public class Constants { public static final String BINDING_QUEUE = "$ZKBIND_DEFQUE$"; + public static final String PROJECT_EDITOR_QUEUE = "PROJECT_EDITOR_QUEUE"; public static final String SHOW_PROJECT_EDITOR = "SHOW_PROJECT_EDITOR"; public static final String SHOW_PROJECTS_LIST = "SHOW_PROJECTS_LIST"; - public static final String SHOW_SERVICE_RECORDS_LIST = "SHOW_SERVICE_RECORDS_LIST"; public static final String SET_SERVICE_RECORDS_LIST_DATA = "SET_SERVICE_RECORDS_LIST_DATA"; public static final String SET_PROJECT_EDITOR_DATA = "SET_PROJECT_EDITOR_DATA"; public static final String SET_PROJECTS_LIST_DATA = "SET_PROJECTS_LIST_DATA"; - public static final String PROJECT_EDITOR_QUEUE = "PROJECT_EDITOR_QUEUE"; public static final String NAV_PARTNERS = "/partners"; public static final String NAV_PROJECTS = "/projects"; @@ -19,4 +18,7 @@ public class Constants { public static final String NAV_SERVICE_RECORDS = "/service-records"; public static final String NAV_SETTINGS = "/settings"; + public static final String WIDGET_ENTITY_SELECTOR = "~./widget/entity-selector.zul"; + + } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/converter/AssociateToNameConverter.java b/lis-ui/src/main/java/hu/user/lis/ui/converter/AssociateToNameConverter.java index 86a66b4..e20e347 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/converter/AssociateToNameConverter.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/converter/AssociateToNameConverter.java @@ -1,19 +1,24 @@ package hu.user.lis.ui.converter; import hu.user.lis.db.Associate; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import org.zkoss.bind.BindContext; import org.zkoss.bind.Converter; -import org.zkoss.zul.Bandbox; +import org.zkoss.zul.impl.XulElement; -public class AssociateToNameConverter implements Converter { +@Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class AssociateToNameConverter implements Converter { @Override - public String coerceToUi(Associate Associate, Bandbox bandbox, BindContext bindContext) { + public String coerceToUi(Associate Associate, XulElement bandbox, BindContext bindContext) { return Associate == null ? null : Associate.getName(); } @Override - public Associate coerceToBean(String s, Bandbox bandbox, BindContext bindContext) { + public Associate coerceToBean(String s, XulElement bandbox, BindContext bindContext) { return null; } } \ No newline at end of file diff --git a/lis-ui/src/main/java/hu/user/lis/ui/converter/PartnerToNameConverter.java b/lis-ui/src/main/java/hu/user/lis/ui/converter/PartnerToNameConverter.java index c152fff..d9115c2 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/converter/PartnerToNameConverter.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/converter/PartnerToNameConverter.java @@ -6,19 +6,19 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.zkoss.bind.BindContext; import org.zkoss.bind.Converter; -import org.zkoss.zul.Bandbox; +import org.zkoss.zul.impl.XulElement; @Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class PartnerToNameConverter implements Converter { +public class PartnerToNameConverter implements Converter { @Override - public String coerceToUi(Partner partner, Bandbox bandbox, BindContext bindContext) { + public String coerceToUi(Partner partner, XulElement bandbox, BindContext bindContext) { return partner == null ? null : partner.getName(); } @Override - public Partner coerceToBean(String s, Bandbox bandbox, BindContext bindContext) { + public Partner coerceToBean(String s, XulElement bandbox, BindContext bindContext) { return null; } } \ No newline at end of file diff --git a/lis-ui/src/main/java/hu/user/lis/ui/converter/ProjectToInfoConverter.java b/lis-ui/src/main/java/hu/user/lis/ui/converter/ProjectToInfoConverter.java index 51cf2c9..868bdd8 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/converter/ProjectToInfoConverter.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/converter/ProjectToInfoConverter.java @@ -1,19 +1,24 @@ package hu.user.lis.ui.converter; import hu.user.lis.db.Project; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import org.zkoss.bind.BindContext; import org.zkoss.bind.Converter; -import org.zkoss.zul.Bandbox; +import org.zkoss.zul.impl.XulElement; -public class ProjectToInfoConverter implements Converter { +@Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ProjectToInfoConverter implements Converter { @Override - public String coerceToUi(Project project, Bandbox bandbox, BindContext bindContext) { - return project == null ? null : String.format("%s | %s | %s", project.getHumanId(), project.getName(), project.getPartner().getName()); + public String coerceToUi(Project project, XulElement bandbox, BindContext bindContext) { + return project == null ? null : String.format("%s - %s - %s", project.getHumanId(), project.getName(), project.getPartner().getName()); } @Override - public Project coerceToBean(String s, Bandbox bandbox, BindContext bindContext) { + public Project coerceToBean(String s, XulElement bandbox, BindContext bindContext) { return null; } } \ No newline at end of file diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/CachedDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/CachedDataModel.java index 09cc5af..52c8186 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/data/CachedDataModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/CachedDataModel.java @@ -1,5 +1,6 @@ package hu.user.lis.ui.data; +import lombok.Setter; import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Component; import org.zkoss.bind.BindUtils; @@ -22,10 +23,13 @@ public abstract class CachedDataModel extends ListModelList { private int cacheEnd; private int resultSetSize = -1; private HashMap cache = new HashMap<>(); + @Setter private FieldComparator sortComparator; public CachedDataModel() { + setMultiple(false); + } public void reset() { diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/CachedSpringDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/CachedSpringDataModel.java index 0fc1153..3c491d7 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/data/CachedSpringDataModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/CachedSpringDataModel.java @@ -1,10 +1,13 @@ package hu.user.lis.ui.data; +import lombok.Getter; +import lombok.Setter; import lombok.extern.log4j.Log4j2; 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.zul.FieldComparator; import java.util.Objects; @@ -12,6 +15,21 @@ import java.util.Objects; @Component @Log4j2 public abstract class CachedSpringDataModel extends CachedDataModel { + + @Getter + @Setter + JSONObject cols = new JSONObject(); + + public void addColumn(String name, String direction) { + JSONObject sort = new JSONObject(); + sort.put("sortDirection", direction); + cols.put(name, sort); + + if (!direction.equals(NATURAL)) { + setSortComparator(new FieldComparator(name, direction.equals(ASCENDING))); + } + } + protected Pageable createPageable(int page, int pageSize, FieldComparator sortComparator) { Pageable pageable; if (Objects.isNull(sortComparator)) { @@ -24,6 +42,5 @@ public abstract class CachedSpringDataModel extends CachedDataModel { log.info("{} {}", getClass().getSimpleName(), pageable); return pageable; } - } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/ProjectStatusDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/ProjectStatusDataModel.java index abf2ce6..0430ad9 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/data/ProjectStatusDataModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/ProjectStatusDataModel.java @@ -23,6 +23,10 @@ public class ProjectStatusDataModel extends CachedSpringDataModel ProjectStatusRepository projectStatusRepository; private boolean activeOnly; + public ProjectStatusDataModel() { + listAll(); + } + @Override public List getResultSet(int page, int pageSize, FieldComparator sortComparator) { List result; @@ -76,7 +80,7 @@ public class ProjectStatusDataModel extends CachedSpringDataModel }); } - public void append() { + public void create() { ProjectStatus entity = projectStatusService.createNew(); long currentCount = projectStatusRepository.count(); entity.setOrder((int) currentCount + 1); @@ -87,6 +91,15 @@ public class ProjectStatusDataModel extends CachedSpringDataModel projectStatusRepository.save(entity); } + public void delete(ProjectStatus entity) { + projectStatusRepository.delete(entity); + List projectStatuses = projectStatusRepository.findAll(Sort.by(Sort.Direction.ASC, "order")); + for (int i = 0; i < projectStatuses.size(); i++) { + projectStatuses.get(i).setOrder(i + 1); + } + projectStatusRepository.saveAll(projectStatuses); + } + public ProjectStatus getDefault() { return projectStatusRepository.findByOrder(1); } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java index 9476356..d033456 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java @@ -4,6 +4,7 @@ import hu.user.lis.db.Associate; import hu.user.lis.db.Project; import hu.user.lis.db.ServiceRecord; import hu.user.lis.db.repository.ServiceRecordRepository; +import hu.user.lis.services.data.EntityDataService; import hu.user.lis.services.data.ServiceRecordService; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; @@ -15,7 +16,6 @@ import org.zkoss.bind.annotation.Init; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zul.FieldComparator; -import javax.persistence.EntityNotFoundException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,9 +29,16 @@ public class ServiceRecordsDataModel extends CachedSpringDataModel serviceRecordDataService; + private boolean listAll; + private Long filterProjectId; + private Long filterAssociateId; + private boolean groupByAssociate; @Init @@ -55,13 +62,16 @@ public class ServiceRecordsDataModel extends CachedSpringDataModel grouped = new HashMap<>(); List allEntities = serviceRecordRepository.findByProjectId(filterProjectId); allEntities.stream().forEach(s -> { + double cost = s.getWorkHours() * s.getAssociate().getMonthlyCost() / 160; if (grouped.containsKey(s.getAssociate().getId())) { ServiceRecord serviceRecord = grouped.get(s.getAssociate().getId()); - serviceRecord.setCost(serviceRecord.getCost() + s.getCost()); + serviceRecord.setCost(serviceRecord.getCost() + cost); serviceRecord.setWorkHours(serviceRecord.getWorkHours() + s.getWorkHours()); } else { - ServiceRecord serviceRecord = serviceRecordRepository.findById(s.getId()).orElseThrow(EntityNotFoundException::new); + ServiceRecord serviceRecord = serviceRecordDataService.clone(s); serviceRecord.setWorkDay(null); + serviceRecord.setId(0L); + serviceRecord.setCost(cost); grouped.put(serviceRecord.getAssociate().getId(), serviceRecord); } }); @@ -104,29 +114,15 @@ public class ServiceRecordsDataModel extends CachedSpringDataModel { - @WireVariable - private PartnerSelectorDataModel partnerSelectorDataModel; - @Init public void init() { super.init(); - //partnerSelectorDataModel.clearSelection(); + } + + @AfterCompose + public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) { + getEntitySelectorRouter().setFormDocument(Partner.class, getFormDocument(), "partner"); } @Command public void onNetAmountChange() { - if (Currency.HUF.equals(formDocument.getCurrency())) { - formDocument.setGrossAmount(formDocument.getNetAmount() * 1.27); - formDocument.setVatAmount(formDocument.getGrossAmount() - formDocument.getNetAmount()); - BindUtils.postNotifyChange(this.formDocument, "grossAmount", "vatAmount"); + if (Currency.HUF.equals(getFormDocument().getCurrency())) { + getFormDocument().setGrossAmount(getFormDocument().getNetAmount() * 1.27); + getFormDocument().setVatAmount(getFormDocument().getGrossAmount() - getFormDocument().getNetAmount()); + BindUtils.postNotifyChange(getFormDocument(), "grossAmount", "vatAmount"); validate(); } } - @Command - public void onPartnerBandChanging(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - InputEvent event = (InputEvent) ctx.getTriggerEvent(); - log.info("onPartnerBandChanging: {}", event.getValue()); - partnerSelectorDataModel.search(event.getValue()); - } - - @Command - public void onPartnerBandOpen(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - OpenEvent event = (OpenEvent) ctx.getTriggerEvent(); - log.info("onPartnerBandOpen: {}", event.isOpen()); - partnerSelectorDataModel.search(null); - } - @Override protected boolean canSave(Invoice entity) { return entity.getNetAmount() > 0 && @@ -80,15 +63,15 @@ public class InvoiceEditorModel extends EntityEditorModel { Messagebox.show("Csak PDF állomány feltöltése támogatott.", "Error", Messagebox.OK, Messagebox.ERROR); return; } - formDocument.setFile(evt.getMedia().getByteData()); - BindUtils.postNotifyChange(this.formDocument, "file"); + getFormDocument().setFile(evt.getMedia().getByteData()); + BindUtils.postNotifyChange(getFormDocument(), "file"); validate(); } @Command public void onRemoveFile() { - formDocument.setFile(null); - BindUtils.postNotifyChange(this.formDocument, "file"); + getFormDocument().setFile(null); + BindUtils.postNotifyChange(getFormDocument(), "file"); validate(); } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/PartnerEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/PartnerEditorModel.java index 9593444..6c6e1f9 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/PartnerEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/PartnerEditorModel.java @@ -1,6 +1,7 @@ package hu.user.lis.ui.editor; import hu.user.lis.db.Partner; +import hu.user.lis.ui.editor.common.EntityEditorModel; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java index 519cc58..9896ecb 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java @@ -6,16 +6,16 @@ import hu.user.lis.db.*; import hu.user.lis.ui.Constants; import hu.user.lis.ui.converter.ProjectStatusConverter; import hu.user.lis.ui.data.*; +import hu.user.lis.ui.editor.common.Editors; +import hu.user.lis.ui.editor.common.EntityEditorModel; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; -import org.zkoss.bind.BindContext; import org.zkoss.bind.BindUtils; import org.zkoss.bind.annotation.*; +import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; -import org.zkoss.zk.ui.event.InputEvent; -import org.zkoss.zk.ui.event.OpenEvent; import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zul.Center; @@ -30,45 +30,57 @@ public class ProjectEditorModel extends EntityEditorModel { @Setter @WireVariable AssociatesDataModel associatesDataModel; + @WireVariable ProjectsDataModel projectsDataModel; - @WireVariable - private PartnerSelectorDataModel partnerSelectorDataModel; + @WireVariable private InvoiceDataModel invoiceDataModel; + @WireVariable private TreasuryDataModel treasuryDataModel; + @Getter @Setter @WireVariable private ServiceRecordsDataModel serviceRecordsDataModel; + @Getter @Setter @WireVariable private ProjectStatusDataModel projectStatusDataModel; + @Getter @Setter @WireVariable private IncomeMarginsDataModel incomeMarginsDataModel; + @WireVariable private ProjectAssociatesDataModel projectAssociatesDataModel; + @Getter @Setter @WireVariable private ProjectStatusConverter projectStatusConverter; + private Map origAssociates; + @Getter @Setter private Map formAssociates; + @Getter @Setter private IncomingInvoice selectedIncomingInvoice; + @Getter @Setter private OutgoingInvoice selectedOutgoingInvoice; + @Getter @Setter private Treasury selectedTreasury; + @Getter @Setter private String partialAssociateName; @@ -76,13 +88,10 @@ public class ProjectEditorModel extends EntityEditorModel { @Init public void init() { super.init(); - projectStatusDataModel.listAll(); } - @Command - public void onSelectedEntityChanged(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - Event event = (Event) ctx.getTriggerEvent(); - log.info("{}", event); + @AfterCompose + public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) { } @Override @@ -97,21 +106,22 @@ public class ProjectEditorModel extends EntityEditorModel { private void initDetails() { initAssociates(); - serviceRecordsDataModel.search(formDocument, true); - incomeMarginsDataModel.recalculate(formDocument); - entitySelectorRouter.setFormDocument(Partner.class, formDocument, "partner"); + serviceRecordsDataModel.search(getFormDocument(), true); + getEntitySelectorRouter().setFormDocument(Partner.class, getFormDocument(), "partner"); + incomeMarginsDataModel.recalculate(getFormDocument()); } + private void initDocuments(Object data) { if (Objects.isNull(data)) { - formDocument = projectsDataModel.createNew(); - log.info("Loading new entity {} to editor", formDocument.getId()); + setFormDocument(projectsDataModel.createNew()); + log.info("Loading new entity {} to editor", getFormDocument().getId()); } else { Long id = (Long) data; Clients.evalJavaScript(String.format("pushNav('/project/%d')", id)); log.info("Loading entity {} to editor", id); - formDocument = projectsDataModel.getById(id); - origDocument = projectsDataModel.clone(formDocument); + setFormDocument(projectsDataModel.getById(id)); + setOrigDocument(projectsDataModel.clone(getFormDocument())); } BindUtils.postNotifyChange(this, "formDocument"); } @@ -132,45 +142,15 @@ public class ProjectEditorModel extends EntityEditorModel { @Command public void onEndEdit(@BindingParam("target") Window target, @BindingParam("save") boolean save) { - if (save && saveEnabled) { - projectsDataModel.save(formDocument); + if (save && isSaveEnabled()) { + projectsDataModel.save(getFormDocument()); if (isAssociatesChanged()) { - projectAssociatesDataModel.updateAssociates(formDocument, formAssociates); + projectAssociatesDataModel.updateAssociates(getFormDocument(), formAssociates); } } - eventBus.showProjectsList(ImmutableMap.of("formDocument", formDocument)); - } - - @Command - public void onPartnerBandChanging(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - InputEvent event = (InputEvent) ctx.getTriggerEvent(); - log.info("onPartnerBandChanging: {}", event.getValue()); - partnerSelectorDataModel.search(event.getValue()); - } - - @Command - public void onPartnerBandOpen(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - OpenEvent event = (OpenEvent) ctx.getTriggerEvent(); - log.info("onPartnerBandOpen: {}", event.isOpen()); - partnerSelectorDataModel.search(null); + eventBus.showProjectsList(ImmutableMap.of("formDocument", getFormDocument())); } -// @Command -// public void onPopupPartners() { -// String page = "~./suppliers.zul"; -// Window editorWindow = (Window) Executions.createComponents(page, null, null); -// editorWindow.addEventListener("onClose", e -> { -// log.info("Suppliers popup result {}", e.getData()); -// if (e.getData() != null) { -// partnerSelectorDataModel.clearSelection(); -// //setSelectedSupplierId(((Supplier) e.getData()).getId()); -// BindUtils.postNotifyChange(this, "selectedSupplierId"); -// } -// }); -// editorWindow.doModal(); -// editorWindow.setFocus(true); -// } - @Override protected boolean canSave(Project entity) { return (StringUtils.isNotBlank(entity.getName()) && @@ -182,11 +162,11 @@ public class ProjectEditorModel extends EntityEditorModel { public void onAddIncoming() { IncomingInvoice entity = invoiceDataModel.createNewIncomingInvoice(); Editors.doEdit(Editors.INCOMING_INVOICE, entity, modifiedEntity -> { - formDocument.getIncomingInvoices().add(modifiedEntity); + getFormDocument().getIncomingInvoices().add(modifiedEntity); selectedIncomingInvoice = modifiedEntity; validate(); BindUtils.postNotifyChange(this, "selectedIncomingInvoice"); - BindUtils.postNotifyChange(this.formDocument, "incomingInvoices"); + BindUtils.postNotifyChange(getFormDocument(), "incomingInvoices"); }); } @@ -194,24 +174,24 @@ public class ProjectEditorModel extends EntityEditorModel { public void onEditIncoming() throws JsonProcessingException { IncomingInvoice entity = invoiceDataModel.clone(selectedIncomingInvoice); Editors.doEdit(Editors.INCOMING_INVOICE, entity, selectedIncomingInvoice, modifiedEntity -> { - Set incomingInvoices = formDocument.getIncomingInvoices(); + Set incomingInvoices = getFormDocument().getIncomingInvoices(); incomingInvoices.remove(selectedIncomingInvoice); incomingInvoices.add(modifiedEntity); selectedIncomingInvoice = modifiedEntity; validate(); BindUtils.postNotifyChange(this, "selectedIncomingInvoice"); - BindUtils.postNotifyChange(this.formDocument, "incomingInvoices"); + BindUtils.postNotifyChange(getFormDocument(), "incomingInvoices"); }); } @Command public void onRemoveIncoming() { if (Objects.nonNull(selectedIncomingInvoice)) { - formDocument.getIncomingInvoices().remove(selectedIncomingInvoice); + getFormDocument().getIncomingInvoices().remove(selectedIncomingInvoice); selectedIncomingInvoice = null; validate(); BindUtils.postNotifyChange(this, "selectedIncomingInvoice"); - BindUtils.postNotifyChange(this.formDocument, "incomingInvoices"); + BindUtils.postNotifyChange(getFormDocument(), "incomingInvoices"); } } @@ -219,11 +199,11 @@ public class ProjectEditorModel extends EntityEditorModel { public void onAddOutgoing() { OutgoingInvoice entity = invoiceDataModel.createNewOutgoingInvoice(); Editors.doEdit(Editors.OUTGOING_INVOICE, entity, modifiedEntity -> { - formDocument.getOutgoingInvoices().add(modifiedEntity); + getFormDocument().getOutgoingInvoices().add(modifiedEntity); selectedOutgoingInvoice = modifiedEntity; validate(); BindUtils.postNotifyChange(this, "selectedOutgoingInvoice"); - BindUtils.postNotifyChange(this.formDocument, "outgoingInvoices"); + BindUtils.postNotifyChange(getFormDocument(), "outgoingInvoices"); }); } @@ -231,24 +211,24 @@ public class ProjectEditorModel extends EntityEditorModel { public void onEditOutgoing() throws JsonProcessingException { OutgoingInvoice entity = invoiceDataModel.clone(selectedOutgoingInvoice); Editors.doEdit(Editors.OUTGOING_INVOICE, entity, selectedOutgoingInvoice, modifiedEntity -> { - Set outgoingInvoices = formDocument.getOutgoingInvoices(); + Set outgoingInvoices = getFormDocument().getOutgoingInvoices(); outgoingInvoices.remove(selectedOutgoingInvoice); outgoingInvoices.add(modifiedEntity); selectedOutgoingInvoice = modifiedEntity; validate(); BindUtils.postNotifyChange(this, "selectedOutgoingInvoice"); - BindUtils.postNotifyChange(this.formDocument, "outgoingInvoices"); + BindUtils.postNotifyChange(getFormDocument(), "outgoingInvoices"); }); } @Command public void onRemoveOutgoing() { if (Objects.nonNull(selectedOutgoingInvoice)) { - formDocument.getOutgoingInvoices().remove(selectedOutgoingInvoice); + getFormDocument().getOutgoingInvoices().remove(selectedOutgoingInvoice); selectedOutgoingInvoice = null; validate(); BindUtils.postNotifyChange(this, "selectedOutgoingInvoice"); - BindUtils.postNotifyChange(this.formDocument, "outgoingInvoice"); + BindUtils.postNotifyChange(getFormDocument(), "outgoingInvoice"); } } @@ -256,11 +236,11 @@ public class ProjectEditorModel extends EntityEditorModel { public void onAddTreasury() { Treasury entity = treasuryDataModel.createNew(); Editors.doEdit(Editors.TREASURY, entity, modifiedEntity -> { - formDocument.getTreasuries().add(modifiedEntity); + getFormDocument().getTreasuries().add(modifiedEntity); selectedTreasury = modifiedEntity; validate(); BindUtils.postNotifyChange(this, "selectedTreasury"); - BindUtils.postNotifyChange(this.formDocument, "treasuries"); + BindUtils.postNotifyChange(getFormDocument(), "treasuries"); }); } @@ -268,24 +248,24 @@ public class ProjectEditorModel extends EntityEditorModel { public void onEditTreasury() { Treasury entity = treasuryDataModel.clone(selectedTreasury); Editors.doEdit(Editors.TREASURY, entity, selectedTreasury, modifiedEntity -> { - Set treasuries = formDocument.getTreasuries(); + Set treasuries = getFormDocument().getTreasuries(); treasuries.remove(selectedTreasury); treasuries.add(modifiedEntity); selectedTreasury = modifiedEntity; validate(); BindUtils.postNotifyChange(this, "selectedTreasury"); - BindUtils.postNotifyChange(this.formDocument, "treasuries"); + BindUtils.postNotifyChange(getFormDocument(), "treasuries"); }); } @Command public void onRemoveTreasury() { if (Objects.nonNull(selectedTreasury)) { - formDocument.getTreasuries().remove(selectedTreasury); + getFormDocument().getTreasuries().remove(selectedTreasury); selectedTreasury = null; validate(); BindUtils.postNotifyChange(this, "selectedTreasury"); - BindUtils.postNotifyChange(this.formDocument, "treasuries"); + BindUtils.postNotifyChange(getFormDocument(), "treasuries"); } } @@ -312,7 +292,7 @@ public class ProjectEditorModel extends EntityEditorModel { @Command public void showServiceRecords(@BindingParam("associate") Associate associate) { log.info("showServiceRecords"); - eventBus.showServiceRecordsList(ImmutableMap.of("filterAssociate", associate, "filterProject", formDocument)); + eventBus.showServiceRecordsList(ImmutableMap.of("filterAssociate", associate, "filterProject", getFormDocument())); } @NotifyChange("formAssociates") @@ -320,19 +300,19 @@ public class ProjectEditorModel extends EntityEditorModel { associatesDataModel.listAll(); formAssociates = new HashMap<>(); origAssociates = new HashMap<>(); - if (Objects.isNull(formDocument.getId())) { + if (Objects.isNull(getFormDocument().getId())) { return; } - List projectAssociates = projectAssociatesDataModel.search(formDocument.getId()); + List projectAssociates = projectAssociatesDataModel.search(getFormDocument().getId()); for (int i = 0; i < associatesDataModel.getSize(); i++) { Associate associate = associatesDataModel.getElementAt(i); boolean exists = projectAssociates.stream() .anyMatch( - pa -> pa.getProjectId().equals(formDocument.getId()) && + pa -> pa.getProjectId().equals(getFormDocument().getId()) && pa.getAssociateId().equals(associate.getId()) ); if (exists) { - log.info("{} is on project {}", associate.getName(), formDocument.getName()); + log.info("{} is on project {}", associate.getName(), getFormDocument().getName()); } formAssociates.put(associate.getId(), exists); origAssociates.put(associate.getId(), exists); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java index 3a266f5..c80c77c 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java @@ -1,23 +1,18 @@ package hu.user.lis.ui.editor; +import hu.user.lis.db.Associate; +import hu.user.lis.db.Project; import hu.user.lis.db.ServiceRecord; -import hu.user.lis.ui.data.AssociateSelectorDataModel; -import hu.user.lis.ui.data.ProjectSelectorDataModel; +import hu.user.lis.ui.editor.common.EntityEditorModel; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; 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.bind.annotation.Init; -import org.zkoss.zk.ui.Executions; -import org.zkoss.zk.ui.event.InputEvent; -import org.zkoss.zk.ui.event.OpenEvent; +import org.zkoss.bind.annotation.*; +import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.UploadEvent; -import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zul.Messagebox; import java.util.Objects; @@ -27,45 +22,15 @@ import java.util.Objects; @Setter public class ServiceRecordEditorModel extends EntityEditorModel { - @WireVariable - private AssociateSelectorDataModel associateSelectorDataModel; - - @WireVariable - private ProjectSelectorDataModel projectSelectorDataModel; - @Init public void init() { - log.info("Initialized"); - origDocument = (ServiceRecord) Executions.getCurrent().getArg().get("origDocument"); - formDocument = (ServiceRecord) Executions.getCurrent().getArg().get("formDocument"); - } - - @Command - public void onProjectBandChanging(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - InputEvent event = (InputEvent) ctx.getTriggerEvent(); - log.info("onProjectBandChanging: {}", event.getValue()); - projectSelectorDataModel.search(event.getValue()); - } - - @Command - public void onProjectBandOpen(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - OpenEvent event = (OpenEvent) ctx.getTriggerEvent(); - log.info("onProjectBandOpen: {}", event.isOpen()); - projectSelectorDataModel.search(null); - } - - @Command - public void onAssociateBandChanging(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - InputEvent event = (InputEvent) ctx.getTriggerEvent(); - log.info("onAssociateBandChanging: {}", event.getValue()); - associateSelectorDataModel.search(event.getValue()); + super.init(); } - @Command - public void onAssociateBandOpen(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - OpenEvent event = (OpenEvent) ctx.getTriggerEvent(); - log.info("onAssociateBandOpen: {}", event.isOpen()); - associateSelectorDataModel.search(null); + @AfterCompose + public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) { + getEntitySelectorRouter().setFormDocument(Associate.class, getFormDocument(), "associate"); + getEntitySelectorRouter().setFormDocument(Project.class, getFormDocument(), "project"); } @Override @@ -85,15 +50,15 @@ public class ServiceRecordEditorModel extends EntityEditorModel { Messagebox.show("Csak PDF állomány feltöltése támogatott.", "Error", Messagebox.OK, Messagebox.ERROR); return; } - formDocument.setFile(evt.getMedia().getByteData()); - BindUtils.postNotifyChange(this.formDocument, "file"); - validate(formDocument); + getFormDocument().setFile(evt.getMedia().getByteData()); + BindUtils.postNotifyChange(getFormDocument(), "file"); + validate(); } @Command public void onRemoveFile() { - formDocument.setFile(null); - BindUtils.postNotifyChange(this.formDocument, "file"); - validate(formDocument); + getFormDocument().setFile(null); + BindUtils.postNotifyChange(getFormDocument(), "file"); + validate(); } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/TreasuryEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/TreasuryEditorModel.java index 456aa03..3cc5667 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/TreasuryEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/TreasuryEditorModel.java @@ -1,6 +1,7 @@ package hu.user.lis.ui.editor; import hu.user.lis.db.Treasury; +import hu.user.lis.ui.editor.common.EntityEditorModel; import lombok.extern.log4j.Log4j2; import org.zkoss.bind.BindContext; import org.zkoss.bind.BindUtils; @@ -36,15 +37,15 @@ public class TreasuryEditorModel extends EntityEditorModel { Messagebox.show("Csak PDF állomány feltöltése támogatott.", "Error", Messagebox.OK, Messagebox.ERROR); return; } - formDocument.setFile(evt.getMedia().getByteData()); - BindUtils.postNotifyChange(this.formDocument, "file"); - validate(formDocument); + getFormDocument().setFile(evt.getMedia().getByteData()); + BindUtils.postNotifyChange(getFormDocument(), "file"); + validate(); } @Command public void onRemoveFile() { - formDocument.setFile(null); - BindUtils.postNotifyChange(this.formDocument, "file"); - validate(formDocument); + getFormDocument().setFile(null); + BindUtils.postNotifyChange(getFormDocument(), "file"); + validate(); } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/EditCompleted.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/common/EditCompleted.java similarity index 63% rename from lis-ui/src/main/java/hu/user/lis/ui/editor/EditCompleted.java rename to lis-ui/src/main/java/hu/user/lis/ui/editor/common/EditCompleted.java index 2f4cd35..dff2d70 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/EditCompleted.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/common/EditCompleted.java @@ -1,4 +1,4 @@ -package hu.user.lis.ui.editor; +package hu.user.lis.ui.editor.common; public interface EditCompleted { diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/Editors.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/common/Editors.java similarity index 64% rename from lis-ui/src/main/java/hu/user/lis/ui/editor/Editors.java rename to lis-ui/src/main/java/hu/user/lis/ui/editor/common/Editors.java index 87a28a9..d849a7e 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/Editors.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/common/Editors.java @@ -1,4 +1,4 @@ -package hu.user.lis.ui.editor; +package hu.user.lis.ui.editor.common; import com.google.common.collect.ImmutableMap; import org.zkoss.zk.ui.Executions; @@ -8,12 +8,14 @@ import java.util.Map; import java.util.Objects; public class Editors { - public static String INCOMING_INVOICE = "~./incoming-invoice-editor.zul"; - public static String OUTGOING_INVOICE = "~./outgoing-invoice-editor.zul"; + 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 OUTGOING_INVOICE = "~./editor/outgoing-invoice-editor.zul"; + public static final String TREASURY = "~./editor/treasury-editor.zul"; + public static final String ASSOCIATE = "~./editor/associate-editor.zul"; + public static final String PARTNER = "~./editor/partner-editor.zul"; - public static String TREASURY = "~./treasury-editor.zul"; - public static String ASSOCIATE = "~./associate-editor.zul"; - public static String PARTNER = "~./partner-editor.zul"; + public static final String PROJECT = "~./editor/project-editor.zul"; public static void doEdit(String page, E entity, EditCompleted editCompleted) { doEdit(page, entity, null, editCompleted); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/EntityEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/common/EntityEditorModel.java similarity index 93% rename from lis-ui/src/main/java/hu/user/lis/ui/editor/EntityEditorModel.java rename to lis-ui/src/main/java/hu/user/lis/ui/editor/common/EntityEditorModel.java index ce7ed17..7118e85 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/EntityEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/common/EntityEditorModel.java @@ -1,15 +1,17 @@ -package hu.user.lis.ui.editor; +package hu.user.lis.ui.editor.common; import hu.user.lis.services.data.EntityDataService; import hu.user.lis.ui.editor.selector.EntitySelectorRouter; import hu.user.lis.ui.event.EventBus; import lombok.Getter; +import lombok.Setter; import lombok.extern.log4j.Log4j2; import org.zkoss.bind.BindUtils; import org.zkoss.bind.PropertyChangeEvent; import org.zkoss.bind.ValidationContext; import org.zkoss.bind.annotation.BindingParam; import org.zkoss.bind.annotation.Command; +import org.zkoss.bind.annotation.Destroy; import org.zkoss.bind.validator.AbstractValidator; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; @@ -31,13 +33,21 @@ public abstract class EntityEditorModel extends Abstract @WireVariable protected EventBus eventBus; + @Getter + @Setter T formDocument; + + @Getter + @Setter T origDocument; + @Getter boolean saveEnabled; + @WireVariable EntityDataService entityDataService; + @Getter @WireVariable EntitySelectorRouter entitySelectorRouter; @@ -106,4 +116,8 @@ public abstract class EntityEditorModel extends Abstract } } + @Destroy + public void onDestroy() { + eventBus.unregister(this); + } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/AssociateSelectorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/AssociateSelectorModel.java new file mode 100644 index 0000000..9e7c809 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/AssociateSelectorModel.java @@ -0,0 +1,52 @@ +package hu.user.lis.ui.editor.selector; + +import hu.user.lis.db.Associate; +import hu.user.lis.ui.converter.AssociateToNameConverter; +import hu.user.lis.ui.data.AssociateSelectorDataModel; +import hu.user.lis.ui.data.CachedSpringDataModel; +import lombok.Getter; +import lombok.Setter; +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.bind.Converter; +import org.zkoss.zul.impl.XulElement; + +@Log4j2 +@Getter +@Setter +@Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class AssociateSelectorModel extends EntitySelectorModel { + @Autowired + AssociateToNameConverter associateToNameConverter; + @Autowired + AssociateSelectorDataModel associateSelectorDataModel; + + @Override + public String selectorIdentifier() { + return Associate.class.getSimpleName(); + } + + @Override + public Converter getDisplayConverter() { + return associateToNameConverter; + } + + @Override + public CachedSpringDataModel getDataModel() { + return associateSelectorDataModel; + } + + @Override + protected void search(String filter) { + associateSelectorDataModel.search(filter); + } + + @Override + protected void reset() { + associateSelectorDataModel.search(null); + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java index cfba1ed..f9b32ac 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java @@ -1,7 +1,9 @@ package hu.user.lis.ui.editor.selector; +import hu.user.lis.services.data.EntityDataServiceBase; import hu.user.lis.ui.data.CachedSpringDataModel; import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; import org.zkoss.bind.BindContext; import org.zkoss.bind.BindUtils; import org.zkoss.bind.Converter; @@ -10,20 +12,20 @@ import org.zkoss.bind.annotation.ContextParam; import org.zkoss.bind.annotation.ContextType; import org.zkoss.zk.ui.event.InputEvent; import org.zkoss.zk.ui.event.OpenEvent; -import org.zkoss.zul.Bandbox; - -import java.lang.reflect.Field; +import org.zkoss.zul.impl.XulElement; @Log4j2 public abstract class EntitySelectorModel { + @Autowired + EntityDataServiceBase entityDataServiceBase; private T selectedEntity; private Object formDocument; private String member; public abstract String selectorIdentifier(); - public abstract Converter getDisplayConverter(); + public abstract Converter getDisplayConverter(); public abstract CachedSpringDataModel getDataModel(); @@ -51,26 +53,14 @@ public abstract class EntitySelectorModel { public void setSelectedEntity(T selectedEntity) { this.selectedEntity = selectedEntity; - try { - Field field = formDocument.getClass().getDeclaredField(member); - field.setAccessible(true); - field.set(formDocument, selectedEntity); - BindUtils.postNotifyChange(formDocument, member); - } catch (Exception e) { - log.error(e); - } + entityDataServiceBase.setFieldValue(formDocument, member, selectedEntity); + BindUtils.postNotifyChange(formDocument, member); } public void setFormDocument(Object formDocument, String member) { this.formDocument = formDocument; this.member = member; - try { - Field field = formDocument.getClass().getDeclaredField(member); - field.setAccessible(true); - selectedEntity = (T) field.get(formDocument); - BindUtils.postNotifyChange(this, "selectedEntity"); - } catch (Exception e) { - log.error(e); - } + selectedEntity = (T) entityDataServiceBase.getFieldValue(formDocument, member); + BindUtils.postNotifyChange(this, "selectedEntity"); } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/PartnerSelectorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/PartnerSelectorModel.java index c07efbf..4740720 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/PartnerSelectorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/PartnerSelectorModel.java @@ -12,7 +12,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.zkoss.bind.Converter; -import org.zkoss.zul.Bandbox; +import org.zkoss.zul.impl.XulElement; @Log4j2 @Getter @@ -31,7 +31,7 @@ public class PartnerSelectorModel extends EntitySelectorModel { } @Override - public Converter getDisplayConverter() { + public Converter getDisplayConverter() { return partnerToNameConverter; } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/ProjectSelectorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/ProjectSelectorModel.java new file mode 100644 index 0000000..080a709 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/selector/ProjectSelectorModel.java @@ -0,0 +1,52 @@ +package hu.user.lis.ui.editor.selector; + +import hu.user.lis.db.Project; +import hu.user.lis.ui.converter.ProjectToInfoConverter; +import hu.user.lis.ui.data.CachedSpringDataModel; +import hu.user.lis.ui.data.ProjectSelectorDataModel; +import lombok.Getter; +import lombok.Setter; +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.bind.Converter; +import org.zkoss.zul.impl.XulElement; + +@Log4j2 +@Getter +@Setter +@Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ProjectSelectorModel extends EntitySelectorModel { + @Autowired + ProjectToInfoConverter projectToInfoConverter; + @Autowired + ProjectSelectorDataModel projectSelectorDataModel; + + @Override + public String selectorIdentifier() { + return Project.class.getSimpleName(); + } + + @Override + public Converter getDisplayConverter() { + return projectToInfoConverter; + } + + @Override + public CachedSpringDataModel getDataModel() { + return projectSelectorDataModel; + } + + @Override + protected void search(String filter) { + projectSelectorDataModel.search(filter); + } + + @Override + protected void reset() { + projectSelectorDataModel.search(null); + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/widget/EntitySelector.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/widget/EntitySelector.java index 44c91a8..1a89bd7 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/widget/EntitySelector.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/widget/EntitySelector.java @@ -1,14 +1,16 @@ package hu.user.lis.ui.editor.widget; +import hu.user.lis.ui.Constants; import lombok.extern.log4j.Log4j2; import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.IdSpace; import org.zkoss.zul.Include; @Log4j2 -public class EntitySelector extends Include { +public class EntitySelector extends Include implements IdSpace { public EntitySelector() { - setSrc("~./entity-selector.zul"); + setSrc(Constants.WIDGET_ENTITY_SELECTOR); } @Override @@ -16,7 +18,6 @@ public class EntitySelector extends Include { super.setDynamicProperty(name, value); setAttribute(name, value, Component.SPACE_SCOPE); log.info("Setting {} = {}", name, value); - } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/event/EventBus.java b/lis-ui/src/main/java/hu/user/lis/ui/event/EventBus.java index 92542ad..740bc24 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/event/EventBus.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/event/EventBus.java @@ -12,15 +12,6 @@ import org.zkoss.zk.ui.event.EventQueues; @Log4j2 public class EventBus { - public EventBus() { -// EventQueue queue = EventQueues.lookup("$ZKBIND_DEFQUE$", EventQueues.SESSION, true); -// queue.subscribe(event -> { -// log.info("EVT: {}", event.getName()); -// }); - - - } - private EventQueue getQueue() { return EventQueues.lookup(Constants.PROJECT_EDITOR_QUEUE, EventQueues.SESSION, true); } @@ -40,8 +31,9 @@ public class EventBus { public void unregister(EventListener listener) { try { getQueue().unsubscribe(listener); + getBindingQueue().unsubscribe(listener); } catch (Exception e) { - log.warn("Not necessary to unregister"); +// log.warn("Not necessary to unregister"); } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java index 21f6ba0..834be1b 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java @@ -4,13 +4,16 @@ import hu.user.lis.db.Associate; import hu.user.lis.ui.Constants; import hu.user.lis.ui.data.AssociatesDataModel; import hu.user.lis.ui.data.CachedSpringDataModel; -import hu.user.lis.ui.editor.Editors; +import hu.user.lis.ui.editor.common.Editors; +import hu.user.lis.ui.view.common.FilterActiveViewModel; import lombok.Getter; import lombok.extern.log4j.Log4j2; import org.zkoss.bind.annotation.Command; import org.zkoss.bind.annotation.Init; import org.zkoss.zk.ui.select.annotation.WireVariable; -import org.zkoss.zk.ui.util.Clients; + +import static hu.user.lis.ui.data.CachedDataModel.ASCENDING; +import static hu.user.lis.ui.data.CachedDataModel.NATURAL; @Log4j2 public class AssociatesViewModel extends FilterActiveViewModel { @@ -19,7 +22,7 @@ public class AssociatesViewModel extends FilterActiveViewModel { AssociatesDataModel associatesDataModel; @Override - CachedSpringDataModel getDataModel() { + protected CachedSpringDataModel getDataModel() { return associatesDataModel; } @@ -31,16 +34,19 @@ public class AssociatesViewModel extends FilterActiveViewModel { @Init public void init() { super.init(); - Clients.evalJavaScript("pushNav('/associates')"); + addColumn("name", ASCENDING); + addColumn("login", NATURAL); + addColumn("active", NATURAL); } + protected void refresh() { associatesDataModel.clearSelection(); - selectedEntity = null; - if (filterShowBoth) { + setSelectedEntity(null); + if (isFilterShowBoth()) { associatesDataModel.search(true, true); } else { - associatesDataModel.search(filterShowActive, filterShowInActive); + associatesDataModel.search(isFilterShowActive(), isFilterShowInActive()); } } @@ -56,8 +62,8 @@ public class AssociatesViewModel extends FilterActiveViewModel { @Command public void onEdit() { - Associate entity = associatesDataModel.clone(selectedEntity); - Editors.doEdit(Editors.ASSOCIATE, entity, selectedEntity, modifiedEntity -> { + Associate entity = associatesDataModel.clone(getSelectedEntity()); + Editors.doEdit(Editors.ASSOCIATE, entity, getSelectedEntity(), modifiedEntity -> { associatesDataModel.save(modifiedEntity); refresh(); }); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java index 75b4dae..6309f80 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java @@ -3,6 +3,7 @@ package hu.user.lis.ui.view; import com.google.common.collect.ImmutableMap; import hu.user.lis.ui.Constants; import hu.user.lis.ui.auth.CurrentProfile; +import hu.user.lis.ui.editor.common.Editors; import hu.user.lis.ui.event.EventBus; import hu.user.lis.ui.session.SessionSettings; import lombok.Getter; @@ -29,7 +30,6 @@ import java.util.Map; public class IndexViewModel implements EventListener { private static final String PARTNERS_LIST = "~./partners.zul"; private static final String PROJECTS_LIST = "~./projects.zul"; - private static final String PROJECT_EDITOR = "~./project-editor.zul"; private static final String ASSOCIATES_LIST = "~./associates.zul"; private static final String PROJECT_ASSOCIATES_LIST = "~./project-associates.zul"; private static final String SERVICE_RECORDS_LIST = "~./service-records.zul"; @@ -37,7 +37,7 @@ public class IndexViewModel implements EventListener { public static Map NAVIGATION = ImmutableMap.of( Constants.NAV_PARTNERS, PARTNERS_LIST, Constants.NAV_PROJECTS, PROJECTS_LIST, - Constants.NAV_PROJECT, PROJECT_EDITOR, + Constants.NAV_PROJECT, Editors.PROJECT, Constants.NAV_ASSOCIATES, ASSOCIATES_LIST, Constants.NAV_PROJECT_ASSOCIATES, PROJECT_ASSOCIATES_LIST, Constants.NAV_SERVICE_RECORDS, SERVICE_RECORDS_LIST, @@ -62,21 +62,14 @@ public class IndexViewModel implements EventListener { eventBus.register(this); log.info("Current session is {}", sessionSettings.getSessionId()); String path = sessionSettings.getCurrentPath(); - - //project editor route(path); - -// Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); -// if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) { -// } log.info("Init {}", path); } private void route(String path) { if (path.startsWith("/project/") && path.split("/").length > 2) { String id = path.split("/")[2]; - selectPage(PROJECT_EDITOR); -// eventBus.setProjectEditorData(Collections.singletonMap("id", id)); + selectPage(Editors.PROJECT); eventBus.setProjectEditorData(Long.parseLong(id)); } else { if (NAVIGATION.containsKey(path)) { @@ -101,7 +94,7 @@ public class IndexViewModel implements EventListener { eventBus.setServiceRecordsListData(event.getData()); } if (Constants.SHOW_PROJECT_EDITOR.equals(event.getName())) { - selectPage(PROJECT_EDITOR); + selectPage(Editors.PROJECT); eventBus.setProjectEditorData((Long) event.getData()); } if (Constants.SHOW_PROJECTS_LIST.equals(event.getName())) { 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 eaf1ee3..a7030bc 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 @@ -4,14 +4,17 @@ import hu.user.lis.db.Partner; import hu.user.lis.ui.Constants; import hu.user.lis.ui.data.CachedSpringDataModel; import hu.user.lis.ui.data.PartnersDataModel; -import hu.user.lis.ui.editor.Editors; +import hu.user.lis.ui.editor.common.Editors; +import hu.user.lis.ui.view.common.FilterActiveViewModel; import lombok.Getter; import lombok.extern.log4j.Log4j2; import org.zkoss.bind.annotation.Command; import org.zkoss.bind.annotation.Init; -import org.zkoss.bind.annotation.NotifyChange; import org.zkoss.zk.ui.select.annotation.WireVariable; +import static hu.user.lis.ui.data.CachedDataModel.ASCENDING; +import static hu.user.lis.ui.data.CachedDataModel.NATURAL; + @Log4j2 public class PartnersViewModel extends FilterActiveViewModel { @WireVariable @@ -19,7 +22,7 @@ public class PartnersViewModel extends FilterActiveViewModel { PartnersDataModel partnersDataModel; @Override - CachedSpringDataModel getDataModel() { + protected CachedSpringDataModel getDataModel() { return partnersDataModel; } @@ -31,22 +34,21 @@ public class PartnersViewModel extends FilterActiveViewModel { @Init public void init() { super.init(); + addColumn("name", ASCENDING); + addColumn("vatNr", NATURAL); + addColumn("address", NATURAL); + addColumn("active", NATURAL); } protected void refresh() { partnersDataModel.clearSelection(); - if (filterShowBoth) { + if (isFilterShowBoth()) { partnersDataModel.search(true, true); } else { - partnersDataModel.search(filterShowActive, filterShowInActive); + partnersDataModel.search(isFilterShowActive(), isFilterShowInActive()); } } - @Command - @NotifyChange("selectedPartner") - public void search() { - } - @Command public void onAdd() { Partner entity = partnersDataModel.createNew(); @@ -59,8 +61,8 @@ public class PartnersViewModel extends FilterActiveViewModel { @Command public void onEdit() { - Partner entity = partnersDataModel.clone(selectedEntity); - Editors.doEdit(Editors.PARTNER, entity, selectedEntity, modifiedEntity -> { + Partner entity = partnersDataModel.clone(getSelectedEntity()); + Editors.doEdit(Editors.PARTNER, entity, getSelectedEntity(), modifiedEntity -> { partnersDataModel.save(modifiedEntity); refresh(); }); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java index 10ec1ea..e5ea839 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java @@ -5,12 +5,12 @@ import hu.user.lis.ui.Constants; import hu.user.lis.ui.data.CachedSpringDataModel; import hu.user.lis.ui.data.ProjectsDataModel; import hu.user.lis.ui.event.EventBus; +import hu.user.lis.ui.view.common.FilterActiveViewModel; import lombok.Getter; import lombok.extern.log4j.Log4j2; import org.zkoss.bind.annotation.Command; import org.zkoss.bind.annotation.Destroy; import org.zkoss.bind.annotation.Init; -import org.zkoss.bind.annotation.NotifyChange; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.select.annotation.WireVariable; @@ -18,6 +18,9 @@ import org.zkoss.zk.ui.select.annotation.WireVariable; import java.util.Map; import java.util.Objects; +import static hu.user.lis.ui.data.CachedDataModel.ASCENDING; +import static hu.user.lis.ui.data.CachedDataModel.NATURAL; + @Log4j2 public class ProjectsViewModel extends FilterActiveViewModel implements EventListener { @@ -28,7 +31,7 @@ public class ProjectsViewModel extends FilterActiveViewModel implements EventBus eventBus; @Override - CachedSpringDataModel getDataModel() { + protected CachedSpringDataModel getDataModel() { return projectsDataModel; } @@ -41,23 +44,24 @@ public class ProjectsViewModel extends FilterActiveViewModel implements public void init() { super.init(); eventBus.register(this); + addColumn("humanId", ASCENDING); + addColumn("partner.name", NATURAL); + addColumn("projectStatus.name", NATURAL); + addColumn("name", NATURAL); + addColumn("contactName", NATURAL); + addColumn("active", NATURAL); } protected void refresh() { projectsDataModel.clearSelection(); - selectedEntity = null; - if (filterShowBoth) { + setSelectedEntity(null); + if (isFilterShowBoth()) { projectsDataModel.search(true, true); } else { - projectsDataModel.search(filterShowActive, filterShowInActive); + projectsDataModel.search(isFilterShowActive(), isFilterShowInActive()); } } - @Command - @NotifyChange("selectedProject") - public void search() { - } - @Command public void onAdd() { eventBus.showProjectEditor(null); @@ -65,29 +69,25 @@ public class ProjectsViewModel extends FilterActiveViewModel implements @Command public void onEdit() { - if (Objects.nonNull(selectedEntity)) { - Project editEntity = entityDataService.clone(selectedEntity); + if (Objects.nonNull(getSelectedEntity())) { + Project editEntity = getEntityDataService().clone(getSelectedEntity()); eventBus.showProjectEditor(editEntity.getId()); } } - @Override public void onEvent(Event event) { if (Constants.SET_PROJECTS_LIST_DATA.equals(event.getName())) { - log.info("Apply Project edit result"); - projectsDataModel.clearSelection(); Map args = (Map) event.getData(); Project formDocument = args.get("formDocument"); + projectsDataModel.clearSelection(); refresh(); projectsDataModel.addToSelection(formDocument); - selectedEntity = formDocument; } } @Destroy public void onDestroy() { - log.info("Destroy {}"); eventBus.unregister(this); } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java index 4c1a0d4..03b69b6 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java @@ -1,31 +1,34 @@ package hu.user.lis.ui.view; -import com.google.common.collect.ImmutableMap; import hu.user.lis.db.Associate; import hu.user.lis.db.Project; import hu.user.lis.db.ServiceRecord; import hu.user.lis.ui.Constants; -import hu.user.lis.ui.data.AssociateSelectorDataModel; import hu.user.lis.ui.data.CachedSpringDataModel; -import hu.user.lis.ui.data.ProjectSelectorDataModel; import hu.user.lis.ui.data.ServiceRecordsDataModel; +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.view.common.EntityViewModel; import lombok.Getter; 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.Executions; -import org.zkoss.zk.ui.event.*; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.SortEvent; import org.zkoss.zk.ui.select.annotation.VariableResolver; import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zkplus.spring.DelegatingVariableResolver; -import org.zkoss.zul.Window; -import java.util.Collections; import java.util.Map; import java.util.Objects; +import static hu.user.lis.ui.data.CachedDataModel.ASCENDING; +import static hu.user.lis.ui.data.CachedDataModel.NATURAL; + @Log4j2 @VariableResolver(DelegatingVariableResolver.class) @@ -34,13 +37,9 @@ public class ServiceRecordsViewModel extends EntityViewModel impl @Getter ServiceRecordsDataModel serviceRecordsDataModel; - @WireVariable @Getter - private AssociateSelectorDataModel associateSelectorDataModel; - @WireVariable - @Getter - private ProjectSelectorDataModel projectSelectorDataModel; + EntitySelectorRouter entitySelectorRouter; @Getter private Project filterProject; @@ -52,7 +51,7 @@ public class ServiceRecordsViewModel extends EntityViewModel impl private EventBus eventBus; @Override - CachedSpringDataModel getDataModel() { + protected CachedSpringDataModel getDataModel() { return serviceRecordsDataModel; } @@ -65,99 +64,49 @@ public class ServiceRecordsViewModel extends EntityViewModel impl public void init() { super.init(); eventBus.register(this); + eventBus.registerForBinding(this); + addColumn("project.humanId", ASCENDING); + addColumn("project.name", NATURAL); + addColumn("project.partner.name", NATURAL); + addColumn("associate.name", NATURAL); + addColumn("workDay", NATURAL); + addColumn("description", NATURAL); + addColumn("workHours", NATURAL); } - @Command - public void onProjectFilterBandChanging(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - InputEvent event = (InputEvent) ctx.getTriggerEvent(); - log.info("onProjectFilterBandChanging: {}", event.getValue()); - projectSelectorDataModel.search(event.getValue()); - } - - @Command - public void onProjectFilterBandOpen(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - OpenEvent event = (OpenEvent) ctx.getTriggerEvent(); - log.info("onProjectFilterBandOpen: {}", event.isOpen()); - projectSelectorDataModel.search(null); - } - - @Command - public void onAssociateFilterBandChanging(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - InputEvent event = (InputEvent) ctx.getTriggerEvent(); - log.info("onAssociateFilterBandChanging: {}", event.getValue()); - associateSelectorDataModel.search(event.getValue()); - } - - @Command - public void onAssociateFilterBandOpen(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { - OpenEvent event = (OpenEvent) ctx.getTriggerEvent(); - log.info("onAssociateFilterBandOpen: {}", event.isOpen()); - associateSelectorDataModel.search(null); + @AfterCompose + public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) { + entitySelectorRouter.setFormDocument(Associate.class, this, "filterAssociate"); + entitySelectorRouter.setFormDocument(Project.class, this, "filterProject"); } private void refresh() { serviceRecordsDataModel.clearSelection(); - selectedEntity = null; - serviceRecordsDataModel.listAll(); - } - - @Command - @NotifyChange("selectedProject") - public void search() { + setSelectedEntity(null); + if (Objects.nonNull(filterProject) || Objects.nonNull(filterAssociate)) { + serviceRecordsDataModel.search(filterProject, filterAssociate); + } else { + serviceRecordsDataModel.listAll(); + } } @Command public void onAdd() { - String page = "~./service-record-editor.zul"; - ServiceRecord newEntity = serviceRecordsDataModel.createNew(); - Window editorWindow = (Window) Executions.createComponents(page, null, - Collections.singletonMap("formDocument", newEntity)); - editorWindow.addEventListener("onClose", e -> { - if (e.getData() != null) { - log.info("Partner popup result {}", e.getData()); - serviceRecordsDataModel.addNew(newEntity); - serviceRecordsDataModel.clearSelection(); - refresh(); - serviceRecordsDataModel.addToSelection(newEntity); - selectedEntity = newEntity; - } + ServiceRecord entity = serviceRecordsDataModel.createNew(); + Editors.doEdit(Editors.SERVICE_RECORD, entity, modifiedEntity -> { + serviceRecordsDataModel.save(modifiedEntity); + refresh(); + serviceRecordsDataModel.addToSelection(modifiedEntity); }); - editorWindow.doModal(); - editorWindow.setFocus(true); } @Command public void onEdit() { - if (Objects.isNull(selectedEntity)) { - return; - } - String page = "~./service-record-editor.zul"; - ServiceRecord editEntity = serviceRecordsDataModel.copy(selectedEntity); - Map arg = ImmutableMap.of("origDocument", selectedEntity, "formDocument", editEntity); - Window editorWindow = (Window) Executions.createComponents(page, null, arg); - editorWindow.addEventListener("onClose", e -> { - if (e.getData() != null) { - log.info("Partner popup result {}", e.getData()); - ServiceRecord modifiedEntity = (ServiceRecord) e.getData(); - serviceRecordsDataModel.clearSelection(); - serviceRecordsDataModel.save(modifiedEntity); - refresh(); - serviceRecordsDataModel.addToSelection(modifiedEntity); - selectedEntity = modifiedEntity; - } + ServiceRecord entity = serviceRecordsDataModel.clone(getSelectedEntity()); + Editors.doEdit(Editors.SERVICE_RECORD, entity, getSelectedEntity(), modifiedEntity -> { + serviceRecordsDataModel.save(modifiedEntity); + refresh(); }); - editorWindow.doModal(); - editorWindow.setFocus(true); - } - - public void setFilterProject(Project filterProject) { - this.filterProject = filterProject; - serviceRecordsDataModel.search(filterProject, filterAssociate); - } - - public void setFilterAssociate(Associate filterAssociate) { - this.filterAssociate = filterAssociate; - serviceRecordsDataModel.search(filterProject, filterAssociate); } @Command @@ -165,6 +114,8 @@ public class ServiceRecordsViewModel extends EntityViewModel impl public void onClearFilters() { filterAssociate = null; filterProject = null; + entitySelectorRouter.setFormDocument(Associate.class, this, "filterAssociate"); + entitySelectorRouter.setFormDocument(Project.class, this, "filterProject"); serviceRecordsDataModel.listAll(); } @@ -180,8 +131,18 @@ public class ServiceRecordsViewModel extends EntityViewModel impl Map data = (Map) evt.getData(); filterAssociate = (Associate) data.get("filterAssociate"); filterProject = (Project) data.get("filterProject"); + entitySelectorRouter.setFormDocument(Associate.class, this, "filterAssociate"); + entitySelectorRouter.setFormDocument(Project.class, this, "filterProject"); serviceRecordsDataModel.search(filterProject, filterAssociate); - BindUtils.postNotifyChange(this, "filterProject", "filterAssociate"); + } + + if (evt instanceof PropertyChangeEvent) { + PropertyChangeEvent propertyEvent = (PropertyChangeEvent) evt; + if (Objects.nonNull(propertyEvent.getBase()) && propertyEvent.getBase().equals(this)) { + if ("filterProject".equals(propertyEvent.getProperty()) || "filterAssociate".equals(propertyEvent.getProperty())) { + serviceRecordsDataModel.search(filterProject, filterAssociate); + } + } } } @@ -190,4 +151,10 @@ public class ServiceRecordsViewModel extends EntityViewModel impl log.info("Destroy {}", getClass().getSimpleName()); eventBus.unregister(this); } + + @Command + public void onDelete() { + serviceRecordsDataModel.delete(getSelectedEntity()); + refresh(); + } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/SettingsViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/SettingsViewModel.java index b7e57e7..0f84d93 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/SettingsViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/SettingsViewModel.java @@ -2,6 +2,7 @@ package hu.user.lis.ui.view; import hu.user.lis.db.ProjectStatus; import hu.user.lis.ui.data.ProjectStatusDataModel; +import hu.user.lis.ui.view.common.AsyncBaseModel; import lombok.Getter; import lombok.extern.log4j.Log4j2; import org.zkoss.bind.annotation.BindingParam; @@ -18,6 +19,7 @@ public class SettingsViewModel extends AsyncBaseModel { @WireVariable @Getter ProjectStatusDataModel projectStatusDataModel; + @Getter private ProjectStatus selectedProjectStatus; @@ -28,17 +30,6 @@ public class SettingsViewModel extends AsyncBaseModel { log.info("Initialized"); } -// @Command -// @NotifyChange("selectedProjectStatus") -// public void onListSelection() { -// selectedProjectStatus = null; -// Set selections = projectStatusDataModel.getSelection(); -// if (selections.size() == 1) { -// selectedProjectStatus = selections.iterator().next(); -// log.info("Selected {}", selectedProjectStatus); -// } -// } - @Command public void onMoveUp() { projectStatusDataModel.moveUp(selectedProjectStatus); @@ -52,8 +43,14 @@ public class SettingsViewModel extends AsyncBaseModel { } @Command - public void onAppend() { - projectStatusDataModel.append(); + public void onCreate() { + projectStatusDataModel.create(); + projectStatusDataModel.listAll(); + } + + @Command + public void onDelete() { + projectStatusDataModel.delete(selectedProjectStatus); projectStatusDataModel.listAll(); } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/SuppliersViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/SuppliersViewModel.java deleted file mode 100644 index bfed189..0000000 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/SuppliersViewModel.java +++ /dev/null @@ -1,89 +0,0 @@ -package hu.user.lis.ui.view; - -import hu.user.lis.db.Supplier; -import hu.user.lis.ui.data.FormDocument; -import hu.user.lis.ui.data.SuppliersDataModel; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.log4j.Log4j2; -import org.zkoss.bind.annotation.BindingParam; -import org.zkoss.bind.annotation.Command; -import org.zkoss.bind.annotation.Init; -import org.zkoss.bind.annotation.NotifyChange; -import org.zkoss.zk.ui.event.Event; -import org.zkoss.zk.ui.event.Events; -import org.zkoss.zk.ui.select.annotation.VariableResolver; -import org.zkoss.zk.ui.select.annotation.WireVariable; -import org.zkoss.zkplus.spring.DelegatingVariableResolver; -import org.zkoss.zul.Window; - -import java.util.Set; - -@Log4j2 -@Getter -@Setter -@VariableResolver(DelegatingVariableResolver.class) -public class SuppliersViewModel { - private FormDocument formDocument; - private boolean canEdit; - private String partialName; - private String partialZipCode; - - private Supplier selectedSupplier; - @WireVariable - SuppliersDataModel suppliersDataModel; - - @Init - public void init() { - log.info("Initialized"); - //TODO atnevezni, mert forditva mukodik - setCanEdit(true); - } - - public String getFieldStyle(String field, String baseStyle) { -// Object error = getFormDocument().get(field + FIELD_POSTFIX_ERROR); -// if (error != null && (boolean) error) -// return baseStyle + " " + ERROR; -// else -// return baseStyle; - return baseStyle; - } - - @Command - @NotifyChange("formDocument") - public void search() { - suppliersDataModel.clearSelection(); - formDocument = null; - suppliersDataModel.search(partialName, partialZipCode); - } - - @Command - @NotifyChange({"formDocument", "partialName", "partialZipCode"}) - public void listAll() { - suppliersDataModel.clearSelection(); - formDocument = null; - partialName = null; - partialZipCode = null; - suppliersDataModel.listAll(); - } - - @Command - @NotifyChange("formDocument") - public void onListSelection() { - formDocument = null; - selectedSupplier = null; - Set selections = suppliersDataModel.getSelection(); - if (selections.iterator().hasNext()) { - selectedSupplier = selections.iterator().next(); - formDocument = FormDocument.builder().build() - .setData(selectedSupplier); - log.info("Selected {}", formDocument); - } - } - - @Command - public void onCloseWindow(@BindingParam("target") Window target, @BindingParam("select") boolean select) { - Event closeEvent = new Event("onClose", target, select ? selectedSupplier : null); - Events.postEvent(closeEvent); - } -} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/AsyncBaseModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/common/AsyncBaseModel.java similarity index 96% rename from lis-ui/src/main/java/hu/user/lis/ui/view/AsyncBaseModel.java rename to lis-ui/src/main/java/hu/user/lis/ui/view/common/AsyncBaseModel.java index 5dd5696..ef4976d 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/AsyncBaseModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/common/AsyncBaseModel.java @@ -1,4 +1,4 @@ -package hu.user.lis.ui.view; +package hu.user.lis.ui.view.common; import org.zkoss.bind.BindUtils; import org.zkoss.bind.annotation.Command; diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/EntityViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java similarity index 81% rename from lis-ui/src/main/java/hu/user/lis/ui/view/EntityViewModel.java rename to lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java index dff27a7..97b261b 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/EntityViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java @@ -1,11 +1,13 @@ -package hu.user.lis.ui.view; +package hu.user.lis.ui.view.common; import hu.user.lis.services.data.EntityDataService; import hu.user.lis.ui.data.CachedSpringDataModel; 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; @@ -22,11 +24,22 @@ import java.util.Set; public abstract class EntityViewModel { @Getter + @Setter T selectedEntity; + + @Getter @WireVariable EntityDataService entityDataService; - abstract CachedSpringDataModel getDataModel(); + protected void addColumn(String name, String direction) { + getDataModel().addColumn(name, direction); + } + + public JSONObject getCols() { + return getDataModel().getCols(); + } + + abstract protected CachedSpringDataModel getDataModel(); @AfterCompose public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) { diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/FilterActiveViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/common/FilterActiveViewModel.java similarity index 97% rename from lis-ui/src/main/java/hu/user/lis/ui/view/FilterActiveViewModel.java rename to lis-ui/src/main/java/hu/user/lis/ui/view/common/FilterActiveViewModel.java index aaf959f..5412710 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/FilterActiveViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/common/FilterActiveViewModel.java @@ -1,4 +1,4 @@ -package hu.user.lis.ui.view; +package hu.user.lis.ui.view.common; import lombok.extern.log4j.Log4j2; import org.zkoss.bind.annotation.Init; diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/UITask.java b/lis-ui/src/main/java/hu/user/lis/ui/view/common/UITask.java similarity index 57% rename from lis-ui/src/main/java/hu/user/lis/ui/view/UITask.java rename to lis-ui/src/main/java/hu/user/lis/ui/view/common/UITask.java index 6f2f784..f30c8d2 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/UITask.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/common/UITask.java @@ -1,4 +1,4 @@ -package hu.user.lis.ui.view; +package hu.user.lis.ui.view.common; public interface UITask { void execute(); diff --git a/lis-ui/src/main/resources/web/associates.zul b/lis-ui/src/main/resources/web/associates.zul index fde58d3..04d0743 100644 --- a/lis-ui/src/main/resources/web/associates.zul +++ b/lis-ui/src/main/resources/web/associates.zul @@ -1,11 +1,11 @@ - + + + + + @@ -28,9 +28,13 @@ autopaging="true" mold="paging" pagingPosition="top" multiple="false" onSelect="@command('onListSelection')" onDoubleClick="@command('onEdit')"> - - - + + + +